shell命令中“&&”的目的是啥?

Posted

技术标签:

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

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

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

但是&& 怎么样? (example)

【问题讨论】:

【参考方案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

    在第一种情况下,false 是一个以1 状态退出的命令

    $ false
    $ echo $?
    1
    

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

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

    $ true
    $ echo $?
    0
    

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

【讨论】:

【参考方案4】:

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

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

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

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

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,这意味着两个条件都为真。

【讨论】:

欢迎来到***。请确保您的代码 sn-p 在此处发布之前有效。你必须纠正它if [[ ($first_command == "1") && ($two_command == "2") ]];then echo "Equal"; fi

以上是关于shell命令中“&&”的目的是啥?的主要内容,如果未能解决你的问题,请参考以下文章

shell中&&和||的使用方法

bat隐藏运行 命令是啥

shell 中 &&和||的方法

>& 在命令中是啥意思? [复制]

Shell多个命令间隔符号;、&、&&、 和 区别

shell命令中;,&,&&,|,||用法及区别