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

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

但是&&呢?(例子)


当前回答

请看例子:

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

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

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

其他回答

请看例子:

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

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

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

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

在壳里,当你看到

$ command one && command two

其目的是仅在第一个命令成功时才执行&&后面的命令。这是Posix shell的惯用方法,而且不仅在Bash中可以找到。

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

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

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

程序在退出时返回信号。如果它们成功退出,则返回0;如果它们失败,则返回大于0。这允许进程之间进行有限的通信。

&&在posix shell语法中被称为AND_IF,它是and_or命令列表的一部分,其中还包括||,这是一个具有类似语义的OR_IF。

语法符号,引用自文档:

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

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

And_or:管道 | and_or AND_IF换行管道 | and_or OR_IF换行管道

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

AND-OR列表是由一个或多个管道组成的序列 操作符“&&”和“||”。 列表是由一个或多个AND-OR列表组成的序列 运算符';'和'&',并可选以';','&'或终止 . 运算符“&&”和“||”具有相同的优先级,并且为 用左结合律求值。例如,以下两种情况 命令只写bar到标准输出: $ false && echo foo ||回声条 $ true || echo foo && echo bar

在第一种情况下,false是一个状态为1的退出命令 美元的假 $ echo $? 1 这意味着echo foo不运行(即,短路echo foo)。然后执行命令回显栏。 在第二种情况下,true以0的代码退出 真正的美元 $ echo $? 0 因此不执行echo foo,然后执行echo bar。

如果第一个语句成功结束,它将执行第二个语句。类似if语句:

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

它首先尝试是否1==1,如果是真的,它检查是否2==2

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

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

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