bash中两个“&”号和分号的操作方式之间有区别吗?


71

如果我想在一行上运行两个单独的命令,我可以这样做:

cd /home; ls -al

或这个:

cd /home && ls -al

我得到相同的结果。但是,这两种方法在后台发生了什么?它们之间的功能区别是什么?

Answers:


88

;刚刚相互分隔命令。该&&说,只有运行下面的命令,如果先前的成功

cd /home; ls -al

cd /home即使在cd命令失败(/home不存在,你没有权限穿越它,等等),它将运行ls -al

cd /home && ls -al

ls -al如果cd /home成功,则只会运行。


2
例如,使用of ; 是非常危险的(至少使用rm命令)cd /some/dir; rm -fr ./*。因此,使用这种破坏性操作,必须确保在执行rm之前您处于正确的位置。正确的命令是cd /some/dir && rm -fr ./*
ALex_hha '16

70
a && b

如果a返回零退出代码,则执行b

a || b

如果a返回非零退出代码,则执行b

a ; b

一个被执行并且然后b被执行。


16
cd /fakedir; ls -al

ls在当前目录中运行,因为cd /fakedir将失败,并且外壳程序将忽略不为零的退出状态。

cd /fakedir && ls -al

因为&&只有前一个命令正常退出(状态为零),ls操作员才会继续操作,因此不会执行任何操作。

还有其他运算符,例如,&它将使过程成为后台。尽管通常放在命令的末尾,但可以将其放在链的中间。


4

您也可以像将它们if..then..else链接命令逻辑一样将它们连接在一起。

例:

ls file.ext && echo "file exists" || echo "file does not exist"
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.