我在.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
答案 0 :(得分:2)
职能不是一等公民。 shell知道它们是什么,但find
,xargs
和nice
等其他命令却不知道。要从另一个程序调用函数,您需要(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 "$@"
set --
更改当前函数的参数;它用一组新的值替换"$@"
。bash -c '"$@"'
是显式的子shell调用。bash "$@"
是子shell的参数。 bash
是$0
(未使用)。外部现有参数"$@"
将作为$1
,$2
等传递给新的bash实例。这就是我们如何让子shell执行函数调用。让我们看看如果你致电nn untar test.txt.tar
会发生什么。 type -t
检查会发现untar
是一个函数。该功能已导出。然后set
将nn
的参数从untar test.txt.tar
更改为bash -c '"$@"' bash untar test.txt.tar
。