似乎sh并未将;
视为命令的定界符。
$ sh -c 'nohup ./server &; echo foo'
sh: -c: line 0: syntax error near unexpected token `;'
那么,如何使用&符号(后台进程)从字符串执行多个命令?
答案 0 :(得分:1)
您追求的是所谓的Asynchronous lists:
如果命令由控制操作符<&sand>(
&
)终止,则外壳程序应在子外壳程序中异步执行该命令。这意味着外壳程序在执行下一个命令之前将不等待命令完成。在后台运行命令的格式为:
command1 & [command2 & ... ]
来源:POSIX.1-2017
以下示例显示了此行为:
sh -c "{ sleep 10 && echo foo ;} & echo bar"
这将执行echo bar
,并在10秒钟后echo foo
由于命令sleep 10 && echo foo
而执行。后者是作为复合命令编写的。
因此,解决方案是删除实际上为sequential list的半列;
。原始失败的原因是您尝试执行空命令。这有效:
sh -c "echo foo & echo bar ; echo car"
但这失败了:
sh -c "echo foo & ; echo car"
因为语法上缺少命令。
最后,解决方案很简单:
sh -c 'nohup ./server & echo foo'