Bash在同一行的后台执行多个命令

时间:2014-03-10 10:54:39

标签: bash shell

当我尝试执行

-bash-3.2$ cd /scratch/;nohup sh xyz.sh>>del.txt &;exit

我收到以下错误..

  

-bash:意外令牌附近的语法错误`;'

我正在尝试使用nohup运行一个独立的过程。& 。 ';'适用于除nohup sh xyz.sh>>del.txt &;

之外的所有其他命令

任何人都可以在这里说出问题。感谢

2 个答案:

答案 0 :(得分:5)

根据bash联机帮助页:

  

列表是由一个运算符;&&&||分隔的一个或多个管道的序列,并且可选地由其中一个;&<newline>

     

如果命令由控制操作符&终止,则shell在子shell中在后台执行命令。 shell不等待命令完成,返回状态为0.由;分隔的命令按顺序执行; shell等待每个命令依次终止。返回状态是最后执行的命令的退出状态。

你可以看到&不仅仅是在后台运行命令的东西,它实际上也是一个分隔符。因此,你不需要需要分号。实际上,尝试它实际上是无效,就像你按顺序放两个分号一样,实际问题是bash不允许空命令:

pax> echo 1 ; echo 2
1
2

pax> echo 1 ; ; echo 2
bash: syntax error near unexpected token ';'

您可以从以下记录中看到这是如何工作的,其中第二个和第三个日期分开,因为sleep 10在后​​台运行:

pax> date ; sleep 5 ; date ; sleep 10 & date ; wait
Thursday 5 April  09:04:07 AWST 2018
Thursday 5 April  09:04:12 AWST 2018
[1] 28999
Thursday 5 April  09:04:12 AWST 2018
[1]+  Done                    sleep 10

答案 1 :(得分:2)

新答案: 正如@CharlesDuffy正确评论的那样;我的旧答案创建了一个子shell,这是完全没必要的。实际上&符号也会终止该行;所以不再需要添加额外的;。 Bash抱怨,因为只包含;的单行不是有效命令。 Bash将您的命令读作:

cd /scratch/
nohup sh xyz.sh>>del.txt &
;
exit

因此,您应该删除nohup行之后的;,并且(再次;感谢@CharlesDuffy);如果您成功进入/scratch/目录,则只调用nohup命令;使用&&表示只有在第一个命令成功时才执行下一个命令。

cd /scratch/ && nohup sh xyz.sh>>del.txt & exit

旧答案:

如果您在bash shell中,可以尝试在命令之间输入命令

cd /scratch/ ; `nohup sh xyz.sh>>del.txt &` ; exit

你可以看看这个question