`;` 和 `&&` 和 `|` 之间有区别吗?

Dis*_*ame 35 shell

当您想运行多个命令时,可以使用;,&&和|

像这样: killall Finder; killall SystemUIServer,cd ~/Desktop/ && rm Caches或者:man grep | man cat例如。

但是|,;和之间有区别&&吗?如果是这样,有什么区别?

jim*_*mij 91

  • ;: 由 a 分隔的命令; 按顺序执行。shell 依次等待每个命令终止。

  • &&: command after&&当且仅当 command before&&返回退出状态为零时才执行。您可以将其视为AND运算符。

  • |: 管道。在表达式command1 | command2中 command1 的标准输出通过管道连接到 command2 的标准输入。

还有更多类似的控制运算符,值得一提的是:

  • ||: command after||当且仅当 command before||返回非零退出状态时执行。您可以将其视为OR运算符。请注意,那|和||是完全不同的动物。

  • &: shell&在后台执行由终止的命令,不等待命令完成并立即返回退出代码 0。再次,&与&&.

  • |&: 一个简写,2>&1 |即 command1 的标准输出和标准错误都通过管道连接到 command2 的标准输入。

此外,如果您使用zshthen 您还可以使用&|或启动命令&!。在这种情况下,job 会立即被拒绝,启动后它在 job 表中没有位置。


vin*_*c17 11

考虑两个命令A和B。当你写

A | B
Run Code Online (Sandbox Code Playgroud)

A和B并行执行,并将 的标准输出A作为 的标准输入发送B。

当你写

A; B
Run Code Online (Sandbox Code Playgroud)

A被执行,然后B被执行(除非set -e已被使用并A以非零退出状态终止,在这种情况下,shell 就在 之后终止A)。

当你写

A && B
Run Code Online (Sandbox Code Playgroud)

A执行,然后B仅在A成功终止(零退出状态)时才执行。这种形式可能比前一种更安全,例如

cd some_dir && rm file*
Run Code Online (Sandbox Code Playgroud)

在&&确保正确的文件被删除品牌,即文件将被删除只有当cd成功。


Mar*_*ich 6

其他答案已经解释了|,&&和;,因此我将添加一些您没有明确要求的内容:||。

A || B
Run Code Online (Sandbox Code Playgroud)

A执行,然后B仅在A失败时执行。这对于对错误情况做出反应非常有用:

martin@martin ~ % rm doesnotexist 2>/dev/null || echo "failed to delete file"
failed to delete file
Run Code Online (Sandbox Code Playgroud)

(2>/dev/null隐藏rm自身的错误信息是必要的。)