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_IF
s (&&
) 和/或OR_IF
s (||
) 可以串在一起(如@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命令中“&&”的目的是啥?的主要内容,如果未能解决你的问题,请参考以下文章