"&&"在shell命令中的目的是什么?
"&&"在shell命令中的目的是什么?
据我所知,使用命令后的&
是为了在后台运行该命令。\n&
的使用示例: tar -czf file.tar.gz dirname &
\n但是&&
又是怎么用的呢?(示例)
在shell中,当你看到以下命令时:
$ command one && command two
意图是只有在第一个命令成功执行时才执行跟随的命令。这是Posix shell的习惯用法,不仅在Bash中可以找到。
它的目的是防止第一个命令失败时运行第二个进程。
你可能注意到我使用了"意图"这个词 - 这是有充分理由的。不同的程序具有不同的行为,所以要使其工作,你需要通过阅读文档和必要时阅读源代码来了解程序如何定义"失败"以及如何处理它。
你的shell将返回值为0视为true,其他正数视为false。
程序在退出时会返回一个信号。如果它们成功退出,应返回0;如果不成功退出,则返回大于零的值。这允许进程之间进行有限的通信。
`&&`在posix shell语法中被称为`AND_IF`,它是一个命令列表的一部分,还包括具有类似语义的`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列表是一个由一个或多个由运算符'&&'和'||'分隔的流水线序列。 列表是由一个或多个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`命令。
"&&"在shell命令中的目的是根据前一个命令是否成功完成来执行下一步操作。这就是为什么我们经常看到它被链接在一起使用,如do_something && do_something_else_that_depended_on_something
。
原因:
在shell脚本中,我们经常需要根据前一个命令的执行结果来决定下一步的操作。如果前一个命令成功执行,我们希望继续执行下一个命令;如果前一个命令失败,我们希望停止执行后续命令。而"&&"就可以满足这个需求,它会判断前一个命令的返回值,如果为0(表示成功),则执行下一个命令;如果不为0(表示失败),则停止执行后续命令。
解决方法:
使用"&&"可以很方便地实现根据前一个命令是否成功来执行下一步操作的需求。只需将需要执行的命令用"&&"连接起来即可。
示例:
假设我们有两个命令:command1和command2,我们希望在command1成功执行后再执行command2。可以使用以下形式的命令:
command1 && command2
如果command1成功执行(返回值为0),则会继续执行command2;如果command1执行失败(返回值不为0),则command2不会被执行。
通过使用"&&",我们可以根据前一个命令的返回值来决定是否执行下一步操作。这样可以使我们的shell脚本更加灵活和高效。
"&&"在shell命令中的目的是什么?
此问题的出现原因是为了解释在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手册的命令列表部分找到。
还有一种"技巧",即使用"Command && echo "Command worked" || echo "Command Failed""。但这种技巧存在问题,只有在可以保证"&&"后面的命令成功执行时才能按预期工作。而使用"if command; then command; else command; fi"并不会显著增加代码长度,并且始终能按预期工作。