从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,方式大约三分之二向下).
Tar*_*Sha 10
在命令末尾添加'&'以并行运行它.但是,这很奇怪,因为在你的情况下,第二个命令取决于第一个命令的最终结果.要么使用顺序命令,要么像这样复制到b和c:
cp /tmp/a /tmp/b &
cp /tmp/a /tmp/c &
Run Code Online (Sandbox Code Playgroud)
除非你明确告诉 bash 在后台启动一个进程,否则它会一直等到该进程退出。所以如果你这样写:
foo args &
Run Code Online (Sandbox Code Playgroud)
bash 将继续而不等待 foo 退出。但如果你没有明确地将进程置于后台,bash 将等待它退出。
从技术上讲,进程可以通过分叉子进程然后退出来有效地将自己置于后台。但由于该技术主要由长期存在的进程使用,因此这不会影响您。