【发布时间】:2011-05-29 11:31:12
【问题描述】:
据我所知,在命令后使用& 是为了在后台运行它。
& 用法示例:tar -czf file.tar.gz dirname &
但是&& 怎么样? (example)
【问题讨论】:
标签: bash shell command-line syntax
据我所知,在命令后使用& 是为了在后台运行它。
& 用法示例:tar -czf file.tar.gz dirname &
但是&& 怎么样? (example)
【问题讨论】:
标签: bash shell command-line syntax
此外,您还有|| 是逻辑或,还有; 只是一个分隔符,它不关心之前的命令发生了什么。
$ 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"
&& 之后的命令会成功,它才会按预期工作。 if command; then command; else command; fi 不会显着延长,并且将始终按预期工作。
&& 允许您根据上一个命令是否成功完成来执行某些操作 - 这就是为什么您倾向于将其链接为do_something && do_something_else_that_depended_on_something。
【讨论】:
命令行 -
&&的目的是什么?
在 shell 中,当你看到
$ command one && command two
目的是仅当第一个命令成功时才执行&& 后面的命令。这是 Posix shell 的惯用语,不仅在 Bash 中存在。
如果第一个进程失败,它打算阻止第二个进程的运行。
您可能会注意到我使用了“意图”这个词——这是有充分理由的。并非所有程序都具有相同的行为,因此要使其正常工作,您需要通过阅读文档以及(如有必要)源代码来了解程序认为什么是“故障”以及它如何处理它。
程序在退出时返回signal。如果成功退出,它们应该返回 0,否则返回大于零。这允许进程之间进行有限的通信。
&& 在posix shell grammar 中被称为AND_IF,它是命令and_or list 的一部分,其中还包括||,它是具有相似语义的OR_IF。
语法符号,引用自文档:
%token AND_IF OR_IF DSEMI /* '&&' '||' ';;' */
还有语法(也引用自文档),它表明任意数量的AND_IFs (&&) 和/或OR_IFs (||) 可以串在一起(如@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被执行。
【讨论】:
'&&' 的一个很常见的用法是使用自动工具编译软件。例如:
./configure --prefix=/usr && make && sudo make install
基本上,如果配置成功,则运行make进行编译,如果成功,则以root身份运行make来安装程序。当我很确定事情会正常工作时,我会使用它,它允许我做其他重要的事情,比如查看 stackoverflow 而不是“监控”进度。
有时候我真的很得意忘形......
tar xf package.tar.gz && ( cd package; ./configure && make && sudo make install ) && rm package -rf
例如,当我从头开始制作一个 linux 时,我会这样做。
【讨论】:
set -o errexit。
【讨论】:
如果第一条语句成功结束,则执行第二条语句。就像一个 if 语句:
if (1 == 1 && 2 == 2)
echo "test;"
它首先尝试 1==1,如果为真则检查 2==2
【讨论】:
&&的用法
if 测试如何在 bash 中工作的深入了解。我从来没有把它想象成一串比较命令,当它们中的任何一个失败时就会中断。所以你得到了我的支持:)
|| 来获得相反的行为,链接命令直到其中一个成功:eei || leu || uie || echo prout3 || echo "never executed"
看例子:
mkdir test && echo "Something" > test/file
Shell 将尝试创建目录test,然后,只有成功才会尝试在其中创建文件。
因此,如果其中一个步骤失败,您可以中断一系列步骤。
【讨论】:
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 @。
看,这和你用来编码的技巧是一样的 :)
【讨论】:
####################### && or (Logical AND) ######################
first_command="1"
two_command="2"
if [[ ($first_command == 1) && ($two_command == 2)]];then
echo "Equal"
fi
当程序检查 if 命令时,程序会创建一个称为退出代码的数字,如果两个条件都为真,则退出代码为零 (0),否则,退出代码为正数。仅当退出代码为零 (0) 时才显示 Equal,这意味着两个条件都为真。
【讨论】:
if [[ ($first_command == "1") && ($two_command == "2") ]];then echo "Equal"; fi