如何在控制台上链接命令?


23

在中bash,有时我想连续运行几个命令,而又不想等到它们完成后再键入新命令。所以我做这样的事情:

cmd1; cmd2; cmd3

不幸的是,其中一个命令可能会失败。在这种情况下,我想停下来。有一种简单的方法可以做到这一点,但是要确保只有在上一个命令的退出代码为0时,我才继续运行这些命令?


这是Unix SE的一个很好的答案
NonlinearFruit

Answers:


39

使用&&运算符,

cmd1 && cmd2 && cmd3

在shellscripting,&&||运营商都优化的实现中C.逻辑运算符的仿照&&手段AND运算,并且||装置OR。Unix与C紧密相关,在C中,如果已经从第一个操作数得知结果,则不评估逻辑运算符的第二个操作数。例如"false && x"false对于any x,因此不需要求值x(特别是如果x是函数调用);类似的"true || x"。这也称为短路语义

在Unix中,传统上将命令的返回值解释为“成功完成”真值:退出代码0表示true(成功),非零表示false(失败)。因此,当第一个命令cmd1 && cmd2返回时"false"(退出状态为非零,表示失败),复合命令的状态为:失败。因此,对它的整体解释cmd1 && cmd2 可能是:“执行cmd1,然后,如果它没有失败,cmd2”。您的问题基本上就是哪一个。

与OR:类似,cmd1 || cmd2可以解释为“ execute cmd1,如果失败则为OR cmd2”。


提示:对于更长的链&&,请考虑放入set -e您的脚本。它基本上将分号更改;&&,并带有一些特殊情况。


1
+1进行解释||
Alp

您能否链接第一个命令的状态?(成功或失败)
雨果·特伦索

@HugoTrentesaux你是什么意思?..成功/失败的结果,或者A || B仅仅是一样的[短路]逻辑A或BA || B成功A成功A失败B成功 ; 并且A || B失败的时候A失败的Bfailure。与相似&&,它遵循逻辑AND。
ulidtko

在shell上下文中,无论A失败还是成功,我如何执行A然后执行B?
Hugo Trentesaux

1
@HugoTrentesaux就是普通常规;(或换行符)默认情况下所做的。set -e;变成&&,大致来说。set +e[默认值]变成A; B您所说的内容:运行A,然后运行no-matter-what B
ulidtko

13

“连锁命令将它们分组”

ping 192.168.0.1 || { echo "ping not successful"; exit 1; }

只有在不成功的情况下,ping才会执行括号中的链接命令组。

注意:

该列表必须以“;”结尾。

方括号和分组的命令之间必须有空格!


6

只需与&&操作员联系。例如:

cmd1 && cmd2 && cmd3

如果其中一个命令失败(返回非0的退出值),则其他命令将不会运行。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.