【问题标题】:What is the purpose of "&&" in a shell command?shell命令中“&&”的目的是什么?
【发布时间】:2011-05-29 11:31:12
【问题描述】:

据我所知,在命令后使用& 是为了在后台运行它。

& 用法示例:tar -czf file.tar.gz dirname &

但是&& 怎么样? (example)

【问题讨论】:

    标签: bash shell command-line syntax


    【解决方案1】:

    此外,您还有|| 是逻辑或,还有; 只是一个分隔符,它不关心之前的命令发生了什么。

    $ false || echo "Oops, fail"
    Oops, fail
    
    $ true || echo "Will not be printed"
    $  
    
    $ true && echo "Things went well"
    Things went well
    
    $ false && echo "Will not be printed"
    $
    
    $ false ; echo "This will always run"
    This will always run
    

    有关这方面的一些详细信息可以在 Bash 手册中的 Lists of Commands 处找到。

    【讨论】:

    • 还有这个“绝招”。 Command && echo "Command worked" || echo "Command Failed"
    • @Dan 这是个坏把戏。只有保证&& 之后的命令会成功,它才会按预期工作。 if command; then command; else command; fi 不会显着延长,并且将始终按预期工作。
    【解决方案2】:

    && 允许您根据上一个命令是否成功完成来执行某些操作 - 这就是为什么您倾向于将其链接为do_something && do_something_else_that_depended_on_something

    【讨论】:

      【解决方案3】:

      命令行 - && 的目的是什么?

      在 shell 中,当你看到

      $ command one && command two
      

      目的是仅当第一个命令成功时才执行&& 后面的命令。这是 Posix shell 的惯用语,不仅在 Bash 中存在。

      如果第一个进程失败,它打算阻止第二个进程的运行。

      您可能会注意到我使用了“意图”这个词——这是有充分理由的。并非所有程序都具有相同的行为,因此要使其正常工作,您需要通过阅读文档以及(如有必要)源代码来了解程序认为什么是“故障”以及它如何处理它。

      你的 shell 认为返回值为 0 表示真,其他正数表示假

      程序在退出时返回signal。如果成功退出,它们应该返回 0,否则返回大于零。这允许进程之间进行有限的通信。

      &&posix shell grammar 中被称为AND_IF,它是命令and_or list 的一部分,其中还包括||,它是具有相似语义的OR_IF

      语法符号,引用自文档:

      %token  AND_IF    OR_IF    DSEMI
      /*      '&&'      '||'     ';;'    */
      

      还有语法(也引用自文档),它表明任意数量的AND_IFs (&&) 和/或OR_IFs (||) 可以串在一起(如@987654337 @ 是递归定义的):

      and_or           :                         pipeline
                       | and_or AND_IF linebreak pipeline
                       | and_or OR_IF  linebreak pipeline
      

      两个运算符具有相同的优先级,并且从左到右进行计算(它们是左结合的)。正如文档所说:

      AND-OR 列表是一个或多个管道的序列,由 运营商"&&""||"

      列表是一个或多个 AND-OR 列表的序列,由 运算符 ';''&' 并可选择由 ';''&' 或 .

      运算符"&&""||" 应具有相同的优先级,并且应为 用左结合性评估。例如,以下两个 命令仅将 bar 写入标准输出:

      $ false && echo foo || echo bar
      $ true || echo foo && echo bar
      
      1. 在第一种情况下,false 是一个以1 状态退出的命令

        $ false
        $ echo $?
        1
        

        这意味着 echo foo 不运行(即短路 echo foo)。然后执行命令echo bar

      2. 在第二种情况下,true 退出,代码为0

        $ true
        $ echo $?
        0
        

        因此echo foo没有被执行,然后echo bar被执行。

      【讨论】:

        【解决方案4】:

        '&&' 的一个很常见的用法是使用自动工具编译软件。例如:

        ./configure --prefix=/usr && make && sudo make install
        

        基本上,如果配置成功,则运行make进行编译,如果成功,则以root身份运行make来安装程序。当我很确定事情会正常工作时,我会使用它,它允许我做其他重要的事情,比如查看 stackoverflow 而不是“监控”进度。

        有时候我真的很得意忘形......

        tar xf package.tar.gz && ( cd package; ./configure && make && sudo make install ) && rm package -rf
        

        例如,当我从头开始制作一个 linux 时,我会这样做。

        【讨论】:

        • 在 REPL 中不错,但对于脚本,我更喜欢 Bash 的 set -o errexit
        【解决方案5】:

        && 将命令串在一起。后续命令只有在前面的命令成功时才会执行。

        同样,|| 将允许在前面的命令失败时执行后续命令。

        Bash Shell Programming

        【讨论】:

          【解决方案6】:

          如果第一条语句成功结束,则执行第二条语句。就像一个 if 语句:

           if (1 == 1 && 2 == 2)
            echo "test;"
          

          它首先尝试 1==1,如果为真则检查 2==2

          【讨论】:

          • 有人能解释一下为什么这个问题被绊倒的用户拒绝了吗?
          • @user3243242 没有错,只是一个不好的例子来说明&&的用法
          • 这是对if 测试如何在 bash 中工作的深入了解。我从来没有把它想象成一串比较命令,当它们中的任何一个失败时就会中断。所以你得到了我的支持:)
          • 结果是你可以通过使用 || 来获得相反的行为,链接命令直到其中一个成功:eei || leu || uie || echo prout3 || echo "never executed"
          【解决方案7】:

          看例子:

          mkdir test && echo "Something" > test/file
          

          Shell 将尝试创建目录test,然后,只有成功才会尝试在其中创建文件。

          因此,如果其中一个步骤失败,您可以中断一系列步骤。

          【讨论】:

            【解决方案8】:

            command_1 && command_2:只有在command_1执行成功时才执行command_2。

            command_1 || command_2:只有在command_1执行不成功时才执行command_2。

            感觉类似于在主流编程语言中执行“if”条件的方式,例如,在if (condition_1 && condition_2){...} 中,如果条件_1 为false,则将省略条件_2,如果在if (condition_1 || condition_2){...} 中,如果条件_1 为@987654326,则将省略条件_2 @。 看,这和你用来编码的技巧是一样的 :)

            【讨论】:

            • 我不知道你所说的“完全相反”是什么意思,但是 $echo '1' || echo '2' 只打印 '1'。和 $wrong_command || echo '2' 在下一行打印一条错误消息和 '2'。你能多解释一下你认为这有什么问题吗?
            【解决方案9】:
            ####################### && or (Logical AND) ######################
            first_command="1"
            two_command="2"
            
            if [[ ($first_command == 1) && ($two_command == 2)]];then
             echo "Equal"
            fi
            

            当程序检查 if 命令时,程序会创建一个称为退出代码的数字,如果两个条件都为真,则退出代码为零 (0),否则,退出代码为正数。仅当退出代码为零 (0) 时才显示 Equal,这意味着两个条件都为真。

            【讨论】:

            • 欢迎来到stackoverflow。请确保您的代码 sn-p 在此处发布之前有效。你必须纠正它if [[ ($first_command == "1") && ($two_command == "2") ]];then echo "Equal"; fi
            猜你喜欢
            • 2015-04-26
            • 1970-01-01
            • 2012-05-16
            • 2017-12-10
            • 1970-01-01
            • 2014-08-16
            • 1970-01-01
            • 2014-12-30
            相关资源
            最近更新 更多