【问题标题】:How do I run multiple background commands in bash in a single line?如何在 bash 中在一行中运行多个后台命令?
【发布时间】:2013-01-14 18:18:20
【问题描述】:

我通常运行多个命令,如下所示:

sleep 2 && sleep 3

sleep 2 ; sleep 3

但是如果我想通过一个命令行命令在后台同时运行它们呢?

sleep 2 & && sleep 3 &

不起作用。用;替换&&也不行

有办法吗?

【问题讨论】:

  • 使用() 包围命令。

标签: linux bash shell


【解决方案1】:

这行得通:

$(sleep 2 &) && sleep 3 &

你也可以这样做:

$(sleep 2 && sleep 3) &

【讨论】:

    【解决方案2】:

    您需要在上一个版本中添加一些括号 --

    (sleep 2 &) && (sleep 3 &)
    

    或者这也有效——

    (sleep 2 &) ; (sleep 3 &)
    

    【讨论】:

    • 注意:当列表与&一起使用时,其退出状态始终为零。所以,上面的两种情况做的事情是一样的(shell依次异步执行两边)。
    【解决方案3】:

    您希望它们如何运行?如果您希望它们在后台启动并按顺序运行,您可以执行以下操作:

    { sleep 2; sleep 3; } &
    

    如果您希望 sleep 3 仅在 sleep 2 成功时运行,则:

    sleep 2 && sleep 3 &
    

    另一方面,如果您希望它们在后台并行运行,您可以改为这样做:

    sleep 2 & sleep 3 &
    

    这两种技术可以结合使用,例如:

    { sleep 2; echo first finished; } & { sleep 3; echo second finished; } &
    

    Bash 就是 bash,通常有多种不同的技术可以完成相同的任务,尽管有时它们之间存在细微差别。

    【讨论】:

    • 这是一个简洁、深思熟虑的答案,“教人钓鱼”终生。谢谢。
    • 如果我们执行 sleep 2 && sleep 3 & 会发生什么?我在 bash 中尝试过,它似乎以相同的方式工作(尝试使用 echo)。
    • @HakanBaba,是的,它确实在后台创建了一个子shell。
    • @Wajahat,你试过sleep 2 && echo "foo" && sleep 3 & echo "bar"" 吗? && 运算符告诉 shell 执行它之前的命令,并且只有当该命令执行没有任何错误时,shell 才会执行后续命令。这与; 本质上不同,因为; 允许后续命令执行而不管前一个命令的退出状态如何,除非它是一个致命错误。 & 告诉 shell 在后台执行它之前的所有“连接”命令。这里的“已连接”表示命令是管道 (|) 或逻辑运算符的一部分。
    • Of these list operators, ‘&&’ and ‘||’ have equal precedence, followed by ‘;’ and ‘&’, which have equal precedence. 在 bash 手册中。
    【解决方案4】:

    要运行多个后台命令,您需要在每个命令的末尾添加&。 前任: (command1 &) && (command2 &) && (command3 &)

    【讨论】:

      【解决方案5】:

      上面的答案使用括号。 Bash 也可以将大括号用于类似目的:

      { sleep 2 && sleep 3; } &
      

      请注意,大括号对语法更挑剔——{ 之后的空格、} 之前的空格和最后的分号是必需的。在某些情况下,大括号更有效,因为它们不会派生新的子外壳。在这种情况下,我不知道它是否会有所作为。

      【讨论】:

      • { sleep 2; sleep 3; } & 呢?
      【解决方案6】:

      我也有同样的使命。 我试过(sleep2 ; fg )& sleep3 ; fg,它工作正常。 并且当你预置 ctrl+c 加倍时,这两个进程就可以停止了。

      【讨论】:

        【解决方案7】:

        您可以像这样使用 bash 命令替换 $(command)

        $(command1 ; command2) &
        

        请注意,stdin 和 stdout 仍然链接到父进程,并且至少重定向 stdout 可能会很棘手。因此,或者您可以将命令链接在一行中,然后将字符串传递给bash 命令以生成一个新进程来处理执行。

        bash -c "command1 ; command2" & 
        

        当您需要在后台运行多个命令时,这在 bash 脚本中特别有用。

        这两个语句应该是等价的。在这两种情况下都会产生一个 bash 进程来处理命令(命令链),最后的 & 会分离执行。

        这次你可以在命令末尾的&之前添加&>/dev/null,以至少重定向stdout,避免在父进程的stdout上输出。比如:

        bash -c "command1 ; command2" &>/dev/null &
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-04-11
          • 2021-08-04
          • 2015-07-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多