【问题标题】:Is it possible for bash commands to continue before the result of the previous command?bash 命令是否可以在前一个命令的结果之前继续?
【发布时间】:2010-03-07 23:10:29
【问题描述】:

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

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

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

【问题讨论】:

    标签: bash


    【解决方案1】:

    是的,如果您什么都不做,那么 bash 脚本中的命令将被序列化。您可以告诉 bash 并行运行一堆命令,然后等待它们全部完成,但可以执行以下操作:

    command1 &
    command2 &
    command3 &
    wait
    

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

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

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

    【讨论】:

    • 可以实际捕获进程的返回状态。使用$!获取每个命令的pid,将它们保存在一个数组中,然后循环遍历该数组,为每个pid调用wait pid; echo $?
    • 有什么方法可以在不显示输出的情况下做到这一点?
    【解决方案2】:

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

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

    【讨论】:

    • +1:关于复制到 /tmp/b 然后将 /tmp/b 复制到 /tmp/c 的问题的要点!
    • 这只是一个人为的例子(:
    • 很清楚,我的意思是在并行化依赖命令时要小心 :)
    【解决方案3】:

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

    foo args &
    

    bash 将继续运行,无需等待 foo 退出。但是如果你没有明确地将进程置于后台,bash 会等待它退出。

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

    【讨论】:

      【解决方案4】:

      一般来说,除非显式发送到后台或将自己作为守护进程分叉,否则 shell 脚本中的命令会被序列化。

      【讨论】:

        【解决方案5】:

        他们等到前一个完成。 但是,您可以编写 2 个脚本并在不同的进程中运行它们,因此它们可以同时执行。这是一个疯狂的猜测,真的,但我认为如果一个进程试图写入另一个进程正在读取的文件,你会得到一个访问错误。

        【讨论】:

          【解决方案6】:

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

          【讨论】:

          • 呃,不。子shell 可能非常有用,但它本身不会在后台运行。默认情况下,父 shell 等待子 shell 完成,就像它创建的任何其他进程一样。
          猜你喜欢
          • 1970-01-01
          • 2012-09-02
          • 1970-01-01
          • 2018-01-12
          • 1970-01-01
          • 2012-05-18
          • 2014-01-28
          • 2022-06-11
          • 2018-10-28
          相关资源
          最近更新 更多