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

时间:2010-03-07 23:10:30

标签: bash

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

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

cp /tmp/a /tmp/b
cp /tmp/b /tmp/c

6 个答案:

答案 0 :(得分:54)

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

command1 &
command2 &
command3 &
wait

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

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

bash manual有更多信息(搜索wait,约有三分之二的时间。)

答案 1 :(得分:10)

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

cp /tmp/a /tmp/b &
cp /tmp/a /tmp/c &

答案 2 :(得分:3)

除非您明确告诉bash在后台启动进程,否则它将等待进程退出。所以,如果你这样写:

foo args &

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

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

答案 3 :(得分:1)

一般情况下,除非明确发送到后台或将自己作为守护进程自行关闭,否则shell脚本中的命令会被序列化。

答案 4 :(得分:1)

他们等到上一个完成。 但是,您可以编写2个脚本并在单独的进程中运行它们,以便可以同时执行它们。实际上,这是一个疯狂的猜测,但我认为如果进程尝试写入另一个进程正在读取的文件,您将收到访问错误。

答案 5 :(得分:0)

我认为你想要的是子壳的概念。这是我刚用Google搜索的一个参考:http://www.linuxtopia.org/online_books/advanced_bash_scripting_guide/subshells.html