bash命令是否可以在上一个命令的结果之前继续?

cor*_*ras 40 bash

从bash脚本运行命令时,bash是否总是等待上一个命令完成,或者只是启动命令然后继续执行下一个命令?

ie:如果从bash脚本运行以下两个命令,事情可能会失败?

cp /tmp/a /tmp/b
cp /tmp/b /tmp/c
Run Code Online (Sandbox Code Playgroud)

Zac*_*sch 58

是的,如果你什么也不做,那么bash脚本中的命令就被序列化了.你可以告诉bash并行运行一堆命令,然后等待它们全部完成,但是做这样的事情:

command1 &
command2 &
command3 &
wait
Run Code Online (Sandbox Code Playgroud)

前三行中每一行末尾的&符号告诉bash在后台运行命令.第四个命令wait告诉bash等待所有子进程都退出.

请注意,如果您以这种方式执行操作,您将无法获得子命令的退出状态(并且set -e将无法工作),因此您将无法以通常的方式判断它们是成功还是失败.

bash的手册有更多的信息(搜索wait,方式大约三分之二向下).

  • 您_can_实际上捕获了进程的返回状态.使用`$!`获取每个命令的pid,将它们保存在一个数组中然后遍历该数组,调用`wait pid; 为每个pid回显$?` (4认同)

Tar*_*Sha 10

在命令末尾添加'&'以并行运行它.但是,这很奇怪,因为在你的情况下,第二个命令取决于第一个命令的最终结果.要么使用顺序命令,要么像这样复制到b和c:

cp /tmp/a /tmp/b &
cp /tmp/a /tmp/c &
Run Code Online (Sandbox Code Playgroud)

  • +1:关于复制到/ tmp/b然后将/ tmp/b复制到/ tmp/c的问题的好点! (4认同)
  • 这只是一个人为的例子(: (2认同)
  • 很清楚,我的观点是在并行化依赖命令时要小心:) (2认同)

R S*_*hko 6

除非你明确告诉 bash 在后台启动一个进程,否则它会一直等到该进程退出。所以如果你这样写:

foo args &
Run Code Online (Sandbox Code Playgroud)

bash 将继续而不等待 foo 退出。但如果你没有明确地将进程置于后台,bash 将等待它退出。

从技术上讲,进程可以通过分叉子进程然后退出来有效地将自己置于后台。但由于该技术主要由长期存在的进程使用,因此这不会影响您。