Shell使用&符从字符串执行多个命令(后台进程)

时间:2018-08-21 07:18:56

标签: shell

似乎sh并未将;视为命令的定界符。

$ sh -c 'nohup ./server &; echo foo'
sh: -c: line 0: syntax error near unexpected token `;'

那么,如何使用&符号(后台进程)从字符串执行多个命令?

1 个答案:

答案 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'