Answers:
无法使用变量在后台调用,因为变量扩展是在为控件运算符(例如&&
和&
)解析命令行后发生的。
还有一种选择是将调用包装在一个函数中:
mayberunbg() {
if [ "$BCKGRND" = "yes" ]; then
"$@" &
else
"$@"
fi
}
...然后根据需要设置变量:
$ BCKGRND=yes mayberunbg sleep 3
[1] 14137
$
[1]+ Done "$@"
# or
$ BCKGRND=yes
$ mayberunbg sleep 3
[1] 14203
$
[1]+ Done "$@"
$ BCKGRND=no mayberunbg sleep 3
# 3 seconds later
$
ed
?无论如何+1,这是最干净的解决方案。
您可能必须使用eval
:
eval "sleep 5" "$BCKGRND"
eval
使外壳重新评估给定的参数。&
因此,文字将被解释为&
命令的末尾而不是命令的参数,从而将命令置于后台。
"$BCKGRND"
一个空参数是什么问题。
eval
将在进行实际评估之前将其参数与空格连接。尝试一下:eval printf "'{%s}\n'" foo "" "" ""
。eval foo "" "" "" ""
完全类似于eval foo
,无论是什么IFS
或其他事物。
eval 'sleep $TIMEOUT' "$BACKGROUND"
。否则,如果变量扩展到另一个变量或包含特殊字符,则可能会出现双倍扩展。而且,嵌套引用可能会很棘手。
echo $!
返回PID