这个有效:
${START} &
这行不通:
APPLICATION_OUTPUT=`echo &`
${START} ${APPLICATION_OUTPUT}
这也行不通:
APPLICATION_OUTPUT="&"
${START} ${APPLICATION_OUTPUT}
还是不行:
APPLICATION_OUTPUT=&
${START} ${APPLICATION_OUTPUT}
如何将“&”附加到带有 arg 的命令?
您可以让 START="FOO"
或更好的东西。
最佳答案
您有几个选项,大致是“安全的”和“不安全的”(第三个是“功能”)。
安全
if [ "$run_in_background" = "yes" ]
then ${START} &
else ${START}
fi
这只是选择要使用的模式。我假设 ${START}
周围没有双引号是可以的——你最好用一个数组来保存命令及其参数,然后使用双引号:"$ {START_ARRAY[@]}"
后面可以有一个 &
。
不安全
if [ "$run_in_background" = "yes" ]
then tail="&"
else tail=""
fi
eval ${START} $tail
这是一个令人担忧的操作。如果用户控制了 $START
的内容,您就无法确保他们没有提交会造成损害的代码。它还会重新读取通过连接 ${START}
和 $tail
生成的字符串,然后重新扫描它。如果有空格或引号或其他特殊字符需要处理,您必须努力使 ${START}
对于 eval
是安全的。总的来说,这不是要走的路。
函数
start()
{
${START}
}
if [ "$run_in_background" = "yes" ]
then start &
else start
fi
“函数”相对于“保险箱”的优势在于您不必重复冗长且可能扭曲的命令行 — 您只需编写一次函数来执行所需的任何操作,然后调用函数是否在后台运行。
使用哪个?
“安全”或“功能”。两者都会起作用;两者都是合理的。
关于bash - 通过变量将后台运算符 (&) 附加到命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38494292/