shell命令中“&&”的用途是什么?

yk9xbfzb  于 2023-03-13  发布在  Shell
关注(0)|答案(9)|浏览(189)

据我所知,在命令之后使用&是为了在后台运行它。
&用法示例:tar -czf file.tar.gz dirname &
但是&&怎么样呢?(示例)

gr8qqesn

gr8qqesn1#

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

$ 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手册中的命令列表中找到。

ubby3x7f

ubby3x7f2#

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

r7xajy2e

r7xajy2e3#

命令行-&&的用途是什么?

在贝壳里,当你看到

$ command one && command two

目的是只有在第一个命令成功的情况下才执行&&后面的命令,这是Posix shell的惯用法,不仅仅在Bash中可以找到。
它的目的是在第一个进程失败时阻止第二个进程的运行。
你可能会注意到我使用了“意图”这个词--这是有充分理由的。不是所有的程序都有相同的行为,所以为了让它工作,你需要通过阅读文档和源代码(如果必要)来理解程序认为什么是“失败”,以及它是如何处理的。

Shell将返回值0视为true,将其他正数视为false

程序在退出时返回signal。如果成功退出,则返回0,否则返回大于0的值。这允许进程之间进行有限数量的通信。
&&在posix shell语法中称为AND_IF,它是and_or命令列表的一部分,该列表还包括||,它是具有类似语义的OR_IF
语法符号,引用自文档:

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

语法(也引用自文档)表明,任意数量的AND_IF&&)和/或OR_IF||)可以串在一起(因为and_or是递归定义的):

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

这两个操作符具有相同的优先级,并且从左到右求值(它们是左结合的)。
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
1.在第二种情况下,true以代码0退出

$ true
$ echo $?
0

因此不执行X1 M26 N1 X,则执行X1 M27 N1 X。

9rnv2umw

9rnv2umw4#

'&&'的一个很常见的用法是用autotools编译软件。例如:

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

基本上,如果configure成功,make运行编译,如果成功,make以root身份运行安装程序。我在确信一切正常时使用它,它允许我做其他重要的事情,比如查看stackoverflow,而不是“监视”进程。
有时候我真的会忘乎所以...

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

我这样做时,例如,使一个linux从头开始框。

ukxgm1gy

ukxgm1gy5#

&&将命令串在一起。只有在前面的命令成功时,才执行后面的命令。
类似地,如果前一个命令失败,||将允许执行后续命令。
参见Bash Shell Programming

wkftcu5l

wkftcu5l6#

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

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

它首先检查1==1是否成立,如果成立,它将检查2==2是否成立。

ubbxdtey

ubbxdtey7#

参见示例:

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

shell将尝试创建目录test,然后,仅当成功时才会尝试在其中创建文件。
因此,如果其中一个步骤失败,您可能会中断一系列步骤。

9o685dep

9o685dep8#

command_1 && command_2:仅当命令1成功执行时才执行命令2。
command_1 || command_2:仅在命令1未成功执行时执行命令2。
感觉类似于主流编程语言中执行“if”条件的方式,例如,在if (condition_1 && condition_2){...}中,如果condition_1为false,则condition_2将被省略;在if (condition_1 || condition_2){...}中,如果condition_1为true,则condition_2将被省略。

bq3bfh9z

bq3bfh9z9#

####################### && or (Logical AND) ######################
first_command="1"
two_command="2"

if [[ ($first_command == 1) && ($two_command == 2)]];then
 echo "Equal"
fi

当程序检查如果命令,然后程序创建一个数字称为退出代码,如果两个条件都是真的,退出代码是零(0),否则,退出代码是正数。只有当显示等于如果退出代码产生零(0),这意味着两个条件都是真的。

相关问题