从bash脚本运行命令时,bash总是等待上一个命令完成,还是只是启动命令,然后继续下一个命令?bash命令是否可以在前一个命令的结果之前继续?
ie:如果从bash脚本中运行以下两个命令,可能会失败吗?
cp /tmp/a /tmp/b
cp /tmp/b /tmp/c
从bash脚本运行命令时,bash总是等待上一个命令完成,还是只是启动命令,然后继续下一个命令?bash命令是否可以在前一个命令的结果之前继续?
ie:如果从bash脚本中运行以下两个命令,可能会失败吗?
cp /tmp/a /tmp/b
cp /tmp/b /tmp/c
是的,如果你什么也不做,然后在bash脚本命令序列化。你可以告诉bash运行一束平行的命令,然后等待他们全部完成,但做这样的事情:
command1 &
command2 &
command3 &
wait
在每个前三行的末尾的&符号告诉Bash在后台运行该命令。第四个命令wait
告诉bash等待所有子进程退出。
请注意,如果您这样做,您将无法获得子命令的退出状态(并且set -e
将不起作用),因此您将无法判断它们是成功还是失败以通常的方式。
bash manual有更多的信息(搜索wait
,约下降三分之二)。
一般来说,除非明确地发送到后台或将自己作为守护进程退出,否则shell脚本中的命令将被序列化。
他们等到前一个完成。 但是,您可以编写2个脚本并在不同的进程中运行它们,以便它们可以同时执行。这真是一个疯狂的猜测,但是我认为如果一个进程试图写入正被另一个进程读取的文件,你会得到一个访问错误。
我想你想要的是一个subshell的概念。以下是我刚刚搜索的一个参考:http://www.linuxtopia.org/online_books/advanced_bash_scripting_guide/subshells.html
呃,没有。子外壳可能切线有用,但是它本身不会在后台运行。默认情况下,父shell等待子shell完成,就像它创建的任何其他进程一样。 – tripleee
除非您明确告诉bash在后台启动进程,否则它将等待进程退出。所以如果你这样写:
foo args &
bash将继续而不用等待foo退出。但是如果你没有明确地把进程放在后台,bash会等待它退出。
从技术上讲,一个过程可以通过分出孩子然后退出来有效地将自己置于背景中。但由于这种技术主要用于长寿命过程,所以这不会影响到你。
在命令的末尾添加'&'以并行运行。 但是,这很奇怪,因为在你的情况下,第二个命令取决于第一个命令的最终结果。无论是使用顺序命令或复制到B和C从这样的:
cp /tmp/a /tmp/b &
cp /tmp/a /tmp/c &
+1:关于复制到/ tmp/b然后将/ tmp/b复制到/ tmp/c的问题的好处! –
这仅仅是一个人为的例子(: – corydoras
这很清楚,我的观点是在并行化相关命令时要小心:) –
您可以_can_实际捕获进程的返回状态。使用'$!'获取每个命令的pid,将它们保存在一个数组中,然后遍历该数组,调用'wait pid; echo $?'为每个pid。 –