当您想运行多个命令时,可以使用;,&&和|
像这样: 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成功。
其他答案已经解释了|,&&和;,因此我将添加一些您没有明确要求的内容:||。
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自身的错误信息是必要的。)