据我所知,在命令后使用&是为了在后台运行它。
&
&用法示例
但是&&呢?(例子)
&&
&&让你根据前一个命令是否成功完成而做一些事情——这就是为什么你倾向于看到它被链接为do_something && do_something_else_that_depended_on_something。
do_something && do_something_else_that_depended_on_something
如果第一个语句成功结束,它将执行第二个语句。类似if语句:
if (1 == 1 && 2 == 2) echo "test;"
它首先尝试是否1==1,如果是真的,它检查是否2==2
请看例子:
mkdir test && echo "Something" > test/file
Shell将尝试创建目录test,然后,除非它成功了将尝试在其中创建文件。
test
因此,如果其中一个步骤失败了,您可能会中断一系列步骤。
&&将命令串在一起。后续命令只有在前一个命令成功时才执行。
类似地,如果前面的命令失败,||将允许后续命令执行。
||
看到Bash Shell编程。
此外,你还有||,它是逻辑上的或,还有;,它只是一个分隔符,它不关心命令之前发生了什么。
;
$ 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手册中的命令列表中找到。
'&&'的一个非常常见的用法是用autotools编译软件。例如:
./configure --prefix=/usr && make && sudo make install
基本上,如果配置成功,则运行make来编译,如果配置成功,则以根用户身份运行make来安装程序。当我确定事情会正常工作时,我就会使用它,它允许我做其他重要的事情,比如查看stackoverflow,而不是“监视”进度。
有时候我真的会忘乎所以……
tar xf package.tar.gz && ( cd package; ./configure && make && sudo make install ) && rm package -rf
我这样做的时候,例如做一个linux从零开始的盒子。
&&的目的是什么?
在壳里,当你看到
$ command one && command two
目的是仅在第一个命令成功时才执行&&后面的命令。这是Posix shell的惯用方法,而且不仅在Bash中可以找到。
如果第一个进程失败,它将阻止第二个进程的运行。
你可能注意到我用了“意图”这个词——这是有充分理由的。并不是所有的程序都有相同的行为,因此要使其正常工作,您需要了解程序认为什么是“失败”,以及它如何通过阅读文档和(如果必要的话)源代码来处理它。
程序在退出时返回信号。如果它们成功退出,则返回0;如果它们失败,则返回大于0。这允许进程之间进行有限的通信。
&&在Posix外壳语法中被称为AND_IF,它是and_or列表命令的一部分,该命令还包括||,它是具有类似语义的OR_IF。
AND_IF
and_or
OR_IF
语法符号,引用自文档:
%token AND_IF OR_IF DSEMI /* '&&' '||' ';;' */
语法(也引用自文档),它表明任意数量的__abc0 (&&)和/或OR_IFs (||)可以串在一起(因为and_or是递归定义的):
and_or : pipeline | and_or AND_IF linebreak pipeline | and_or OR_IF linebreak pipeline
两个运算符具有相同的优先级,并且从左到右计算(它们是左结合的)。正如医生所说:
AND-OR列表是一个或多个由AND-OR分隔的管道的序列 操作符"&&"和"||" . 列表是由一个或多个AND-OR列表组成的序列 操作符';'和'&',并可选地以';', '&'或终止 . < / p > 运算符"&&"和"||"具有相同的优先级,且应为 用左结合律求值。例如,以下两种情况 命令只写入bar到标准输出: $ false && echo foo || echo bar $ true || echo foo && echo bar
AND-OR
"&&"
"||"
';'
'&'
$ false && echo foo || echo bar $ true || echo foo && echo bar
在第一种情况下,false是一个以1状态退出的命令
1
$ false $ echo $? 1
这意味着echo foo不运行(即,短路echo foo)。然后执行echo bar命令
echo foo
echo bar
在第二种情况下,true以0的代码退出
0
$ true $ echo $? 0
因此echo foo不被执行,那么echo bar将被执行
command_1 && command_2:只在command_1执行成功时才执行command_2。
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是true,条件_2将被省略。 看,这和你编码时使用的技巧是一样的:)
if (condition_1 && condition_2){...}
false
if (condition_1 || condition_2){...}
true
####################### && or (Logical AND) ###################### first_command="1" two_command="2" if [[ ($first_command == 1) && ($two_command == 2)]];then echo "Equal" fi
当程序检查if命令时,程序创建一个称为退出码的数字,如果两个条件都为真,退出码为零(0),否则,退出码为正数。仅当输出码为0(0)时显示Equal,这意味着两个条件都为真。