Bash : 如何在另一个函数中使用一个函数(一个字符串参数)

Bash : how to use a function (which is a string param) in an other function

我的 .bashrc 中有这些函数:

# This function just untar a file:
untar()
{
    tar xvf 
}

# This function execute a command with nohup (you can leave the terminal) and nice for a low priority on the cpu:
nn()
{
    nohup nice -n 15 "$@" &
}

在测试 nn 函数之前,我创建了一个 tar:

echo test > test.txt
tar cvf test.txt.tar test.txt

现在我要做的是:

nn untar test.txt.tar

但只有这个有效:

nn tar xvf test.txt.tar

这里是nohup.out中的错误:

nice: ‘untar’: No such file or directory

函数不是第一个class公民。 shell 知道它们是什么,但 findxargsnice 等其他命令则不知道。要从另一个程序调用函数,您需要 (a) 将其导出到 sub-shells,以及 (b) 显式调用 sub-shell.

export -f untar
nn bash -c 'untar test.txt.tar'

如果你想让呼叫者更容易,你可以自动执行此操作:

nn() {
    if [[ $(type -t "") == function ]]; then
        export -f ""
        set -- bash -c '"$@"' bash "$@"
    fi

    nohup nice -n 15 "$@" &
}

这一行值得解释:

set -- bash -c '"$@"' bash "$@"
  1. set -- 改变当前函数的参数;它将 "$@" 替换为一组新值。
  2. bash -c '"$@"' 是显式子shell 调用。
  3. bash "$@" 是 subshell 的参数。 bash[=21=](未使用)。外部现有参数 "$@" 作为 </code>、<code> 等传递给新的 bash 实例。这就是我们如何让 subshell 执行函数调用。

让我们看看调用 nn untar test.txt.tar 会发生什么。 type -t 检查发现 untar 是一个函数。函数被导出。然后 setnn 的参数从 untar test.txt.tar 更改为 bash -c '"$@"' bash untar test.txt.tar