【问题标题】:Bash executing multiple commands in background in same lineBash在同一行在后台执行多个命令
【发布时间】:2014-03-10 10:54:39
【问题描述】:

当我尝试执行时

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

我收到以下错误..

-bash: 意外标记 `;' 附近的语法错误

我正在尝试使用 nohup .. & 运行一个分离的进程。 ';'对除nohup sh xyz.sh>>del.txt &;以外的所有其他命令都适用

谁能告诉这里的问题。谢谢

【问题讨论】:

  • 尝试在“;”前后放置空格
  • 删除&之后的;,因为&本身就是一个命令分隔符。
  • 我在 ';' 前后使用了空格.我使用 '&' 不是作为分隔符,而是将其表示为一个分离的进程。
  • @KannanRG 我们知道& 用于在后台运行进程。它也充当命令分隔符!所以之后的; 会导致错误。 bash 不接受 blank 命令。
  • @KannanRG 多少次?删除& 之后的;。你已经被告知要这样做。

标签: bash shell


【解决方案1】:

根据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

【讨论】:

  • 这是完全正确的,但如果它确实展示了一个像标题所要求的那样在后台运行多个命令的示例,例如 foo & bar &,那么投票会更容易。跨度>
【解决方案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

【讨论】:

  • 谢谢,这对我有用。删除';'在@devnull建议的'&'之后也对我有用。
  • 这具有显着的性能开销——它创建了一个完全不必要的fork()ed 子shell,并且与没有命令替换的版本相比没有任何好处。
  • @CharlesDuffy:感谢您的评论。我在 4 年前写了这个答案,现在很惭愧。我重写了我的答案。
  • 感谢您花时间更新它。 (顺便说一句,如果cd 失败,我还建议cd /scratch && nohup ... 避免在错误目录中运行命令的风险)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-11
相关资源
最近更新 更多