这有效:
${START} &
这不起作用:
APPLICATION_OUTPUT=`echo &`
${START} ${APPLICATION_OUTPUT}
这也不起作用:
APPLICATION_OUTPUT="&"
${START} ${APPLICATION_OUTPUT}
仍然没有:
APPLICATION_OUTPUT=&
${START} ${APPLICATION_OUTPUT}
如何添加“&”使用arg的命令?
您可以START="FOO"
或其他更好的内容。
答案 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.