【问题标题】:Precedence of operators in BashBash 中运算符的优先级
【发布时间】:2018-06-13 11:38:09
【问题描述】:

我有一个表达式cat file.txt | script.sh 1> output.txt || mkdir TEST &。最后&是指只有mkdir在后台执行还是整个表达式执行?

【问题讨论】:

    标签: bash operators


    【解决方案1】:

    关于&,会影响整个表情。 你可以很容易地用一些不那么简单的东西来检查它:

    echo '1' > file1  || echo '2' > file2 &
    

    (按照你的方式放置一些输出重定向),否则,只是

    echo '1' || echo '2' &
    

    这里第一个 echo 的输出将返回 true,并且条件中的第二部分不会执行,但无论如何它都会进入后台。

    然后,您可以检查:

    false || echo '2' > file2  &
    

    或更简单的版本:

    false || echo '2' &
    

    在这里,回显将被执行,并且也在后台执行。

    然后,在这两种情况下,它都会在后台执行,即使在第一种情况下只执行第一部分,而在第二种情况下只执行第二部分。

    【讨论】:

    • (cat file.txt | script.sh 1> output.txt || mkdir TEST) &cat file.txt | script.sh 1> output.txt || mkdir TEST &有区别吗?
    • 不,它们将执行相同的操作。
    【解决方案2】:

    &; 是 POSIX shell 语言中的分隔符。它们适用于整个管道。

    您可以设计一个实验来(反)证明它:

    [ ! -d TEST ] || rmdir TEST #cleanup
    sleep 1 | (sleep 1 ; false) || mkdir TEST & 
    ls -d TEST #will run immediately (because & applied to the whole pipeline) 
    #but fail because the `||` part wasn't reached yet
    

    或者您可以在 POSIX 规范中查找 shell grammar

    【讨论】:

      【解决方案3】:

      如果您将& 放在命令末尾,它将在后台运行整个命令。你可以做这样的事情在后台并行运行它

      (cat file.txt | grep e > output.txt) & (mkdir TEST) &
      

      这个答案可能会说清楚:Answer

      【讨论】:

        猜你喜欢
        • 2011-07-07
        • 2021-10-25
        • 2015-03-20
        • 2011-06-21
        • 2013-02-24
        • 2012-08-10
        • 2020-03-05
        相关资源
        最近更新 更多