我想知道是否有一种方法可以将&符号放入变量中并仍然使用它来将进程发送到后台。
这有效:
BCKGRND=yes
if [ "$BCKGRND" = "yes" ]; then
sleep 5 &
else
sleep 5
fi
但仅用一行来完成这五行不是很酷吗?就像这样:
BCKGRND='&'
sleep 5 ${BCKGRND}
但这是行不通的。如果 BCKGRND 未设置,则它可以工作 - 但当设置它时,它会将其解释为文字“&”并出错。
答案1
不可能使用变量来后台调用,因为在解析命令行以获取控制运算符(例如&&
和&
)之后会发生变量扩展。
另一种选择是将调用包装在函数中:
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
$
答案2
你可以翻转事物并改变“前景”:
FOREGROUND=fg
sleep 5 & ${FOREGROUND}
设置FOREGROUND
为true
或空以在后台运行该进程。 (设置FOREGROUND
为true
在后台运行确实令人困惑!适当的变量名称留给读者作为练习。)
答案3
您可能必须使用eval
:
eval "sleep 5" "$BCKGRND"
eval
导致 shell 重新评估给定的参数。因此,文字&
将被解释为&
位于命令末尾,而不是作为命令的参数,从而将命令置于后台。