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

时间:2017-09-25 18:36:13

标签: linux bash ubuntu nohup nice

我在.bashrc中有这些功能:

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

# 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

1 个答案:

答案 0 :(得分:2)

职能不是一等公民。 shell知道它们是什么,但findxargsnice等其他命令却不知道。要从另一个程序调用函数,您需要(a)将其导出到子shell,(b)显式调用子shell。

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

如果您想让调用者更轻松,可以自动执行此操作:

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

    nohup nice -n 15 "$@" &
}

这条线值得解释:

set -- bash -c '"$@"' bash "$@"
  1. set --更改当前函数的参数;它用一组新的值替换"$@"
  2. bash -c '"$@"'是显式的子shell调用。
  3. bash "$@"是子shell的参数。 bash$0(未使用)。外部现有参数"$@"将作为$1$2等传递给新的bash实例。这就是我们如何让子shell执行函数调用。
  4. 让我们看看如果你致电nn untar test.txt.tar会发生什么。 type -t检查会发现untar是一个函数。该功能已导出。然后setnn的参数从untar test.txt.tar更改为bash -c '"$@"' bash untar test.txt.tar