shell命令中“&&”的用途是什么?
据我所知,在命令后面使用&
是为了在后台运行它。
&
使用示例: tar -czf file.tar.gz dirname &
但是&&
怎么样? (看看这个例子: https : //serverfault.com/questions/215179/centos-100-disk-full-how-to-remove-log-files-history-etc#answer-215188 )
&&
可以让你根据前一个命令是否成功完成一些事情 – 这就是为什么你倾向于将它链接为do_something && do_something_else_that_depended_on_something
。
而且,你也有||
这是合乎逻辑的,也是;
这只是一个不关心之前发生的事情的分隔符。
$ false || echo "Oops, fail" Oops fail $ true || echo "Will not be printed" $ $ true && echo "Things went well" Things went well $ false ; echo "This will always run" This will always run
关于这个的一些细节可以在这里find命令列表在Bash手册。
命令行 –
&&
的目的是什么?
在壳里,当你看到
$ command one && command two
意图是仅当第一个命令成功时才执行&&
的命令。 这是Posix炮弹的惯用,不仅在Bash中发现。
如果第一个失败,它将阻止第二个进程的运行。
进程返回0为真,其他正数为假
程序退出时返回一个信号 。 他们应该返回0,如果他们成功退出,或大于零,如果他们不。 这允许进程之间的有限数量的通信。
&&
在posix shell语法中被称为AND_IF
,它是一个and_or
命令列表的一部分,其中还包括||
这是一个具有类似语义的OR_IF
。
语法符号:
%token AND_IF OR_IF DSEMI /* '&&' '||' ';;' */
语法:
and_or : pipeline | and_or AND_IF linebreak pipeline | and_or OR_IF linebreak pipeline
两个运算符具有相同的优先级并从左到右进行评估(它们是左关联的)。例如,以下内容:
$ false && echo foo || echo bar $ true || echo foo && echo bar
既回声只有bar
。
-
在第一种情况下,错误是一个退出状态为
1
的命令$ false $ echo $? 1
这意味着
echo foo
不运行 (即,echo foo
短路)。 然后命令echo bar
被执行。 -
在第二种情况下,真正的退出代码为
0
$ true $ echo $? 0
因此不会执行
echo foo
,然后执行echo bar
。
“&&”的常见用法是用autotools编译软件。 例如:
./configure --prefix=/usr && make && sudo make install
基本上如果configuration成功,make运行编译,如果成功,make以root身份运行安装程序。 我使用这个时,我基本肯定的事情会起作用,它允许我做其他重要的事情,如看看stackoverflow不是“监视”的进展。
有时候我真的被带走了
tar xf package.tar.gz && ( cd package; ./configure && make && sudo make install ) && rm package -rf
我这样做,例如从头开始一个Linux的框。
&&
string命令在一起。 连续的命令只有在前面的命令成功时才执行。
同样, ||
将允许后续的命令执行,如果前面的失败。
请参阅Bash Shell编程 。
看例子:
mkdir test && echo "Something" > test/file
Shell将尝试创build目录test
,然后, 只有在成功的情况下才会尝试在其中创build文件。
所以如果其中一个失败,你可能会中断一系列的步骤。
command_1 && command_2
:只有当command_1执行成功时才执行command_2。
command_1 || command_2
command_1 || command_2
:只有当command_1执行不成功时才执行command_2。
感觉与在主stream编程语言中如何执行“if”条件类似, if (condition_1 && condition_2){...}
condition_2将被省略,如果condition_1为false
且if (condition_1 || condition_2){...}
如果condition_1为true
那么condition_2将被忽略。 看,这是你用于编码的相同的技巧:)
如果第一条语句成功结束,则执行第二条语句。 像if语句一样:
if( 1 == 1 && 2 == 2 ) echo "test;"
它的第一次尝试,如果1 == 1,如果这是真的,它会检查2 == 2