通过变量将背景操作符(&)附加到命令

时间:2016-07-21 03:15:39

标签: bash

这有效:

${START} &

这不起作用:

APPLICATION_OUTPUT=`echo &`
${START} ${APPLICATION_OUTPUT}

这也不起作用:

APPLICATION_OUTPUT="&"
${START} ${APPLICATION_OUTPUT}

仍然没有:

APPLICATION_OUTPUT=&
${START} ${APPLICATION_OUTPUT}

如何添加“&”使用arg的命令?

您可以START="FOO"或其他更好的内容。

2 个答案:

答案 0 :(得分:6)

你有两个选择,大概是“安全”和“安全”。和不安全的' (还有第三个,'功能')。

安全

if [ "$run_in_background" = "yes" ]
then ${START} &
else ${START}
fi

这只是选择使用哪种模式。我假设在${START}周围没有双引号是正常的 - 你可能会更好地使用数组保存命令及其参数然后使用双引号:"${START_ARRAY[@]}"可选地使用{ {1}}之后。

不安全

&

这是一项令人担忧的行动。如果用户控制if [ "$run_in_background" = "yes" ] then tail="&" else tail="" fi eval ${START} $tail 的内容,您就会遇到问题,确保他们无法提交会造成损害的代码。它还重新读取通过连接$START${START}生成的字符串,然后重新扫描它。如果要处理空格或引号或其他特殊字符,您必须努力使$tail${START}安全。总的来说,这不是可行的方法。

功能

eval

功能'的优点过安全的'是你不必重复一个长而可能扭曲的命令行 - 你只需编写一次函数来执行所需的任何操作,然后调用该函数在后台运行。

使用哪种?

安全'或者'功能'。两者都有效;两者都是合理的。

答案 1 :(得分:1)

终止命令并使其在后台运行的&,作为基本shell语法,必须出现在命令之前发生任何参数扩展。可以确定某些命令是在不知道哪个命令的情况下运行的,这就是为什么你可以存储要在参数中运行的命令的名称的原因

要执行您想要的操作,需要调用eval来评估由各种扩展产生的字符串作为shell命令。

$ START=xterm
$ APPLICATION_OUTPUT="&"
$ eval ${START} ${APPLICATION_OUTPUT}
# Runs 'xterm' in the background, because eval
# combines "xterm" and "&" into a single string
# "xterm &", which it then executes in the current
# shell.