bash 中两个与符号和分号的操作方式有区别吗?

Sea*_*n P 71 bash

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

cd /home; ls -al
Run Code Online (Sandbox Code Playgroud)

或这个:

cd /home && ls -al
Run Code Online (Sandbox Code Playgroud)

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

use*_*517 89

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

cd /home; ls -al
Run Code Online (Sandbox Code Playgroud)

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

cd /home && ls -al
Run Code Online (Sandbox Code Playgroud)

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

  • 使用```; ``` 是一个非常危险的(至少使用 rm 命令),例如 ```cd /some/dir; rm -fr ./*```. 所以对于这种破坏性的操作,你必须在执行rm之前确定你在正确的地方。正确的命令是```cd /some/dir && rm -fr ./*``` (3认同)

小智 71

a && b
Run Code Online (Sandbox Code Playgroud)

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

a || b
Run Code Online (Sandbox Code Playgroud)

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

a ; b
Run Code Online (Sandbox Code Playgroud)

a被执行,然后b被执行。


Jef*_*and 16

cd /fakedir; ls -al
Run Code Online (Sandbox Code Playgroud)

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

cd /fakedir && ls -al
Run Code Online (Sandbox Code Playgroud)

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

还有其他操作符,例如&它们将作为进程的后台。虽然通常放在命令的末尾,但也可以放在链的中间。