;
编写 bash 脚本时,使用分号还是双 & 符号来链接命令更好&&
?
答案1
作为steeldriver 说,两者并无优劣之分。您可以根据不同的目的使用它们。
如果您想先运行一个命令,然后再运行另一个命令,请使用;
。无论第一个命令是否成功,第二个命令都会运行。用 分隔命令与;
先运行一个命令,然后运行另一个命令具有相同的目的。在脚本中,这些命令实现了相同的目的:
first-command
second-command
first-command; second-command
相反,&&
检查第一个命令的退出状态,并且只有第一个命令成功时才运行第二个命令。在 shell 脚本中(以及当您以交互方式使用 shell 时),退出代码 0 表示“真”或“成功”,而任何其他退出代码表示“假”或“失败”。(这样,程序可以返回不同的错误代码来表示不同类型的错误。)
因此,这里像以前一样,first-command
首先运行。但如果不成功,则second-command
根本不运行:
first-command && second-command
这与使用方法类似,但不完全相同if
:
if first-command; then
second-command
fi
它们的不同之处在于first-command
失败时会发生什么。使用 时&&
,整个复合命令的退出状态是first-command
返回的任何失败(即非零)退出代码。相反,使用 时if
,当失败时,整个复合命令的退出状态为零(即成功)first-command
。
举个例子,在这种情况下,你可能实际上会合理地考虑;
和&&
,假设你想运行sudo apt update
,它将检索有关每个配置的软件源中有哪些软件包可用以及哪些版本的最新信息,然后sudo apt upgrade
运行将已安装的软件包升级到最新可用版本。这是广泛建议的,也是我通常运行的:
sudo apt update && sudo apt upgrade
因为它使用&&
,所以它会运行sudo apt update
,但只有在报告成功sudo apt upgrade
时才会运行。你通常想要这样做的原因是,sudo apt update
对于那些特定的命令,您通常需要检查第一个命令产生的任何错误,以便决定如何继续。
但是您可能预料到会出现问题,但仍想升级可以升级的软件包。或者您可能没有预料到会出现问题,但仍然希望继续进行。在这种情况下,您可以使用以下命令将它们分开;
(或者在脚本中将它们放在不同的行上):
sudo apt update; sudo apt upgrade
然后运行sudo apt update
,sudo apt upgrade
无论报告是否成功,都会运行。
这是一个示例,说明您可能实际上需要在两者之间进行选择,因为在这种情况下,第一个命令对于第二个命令很重要,但即使第一个命令失败,第二个命令可能仍然有用。但是,在许多情况下,您想要运行一个命令然后运行另一个命令,您要么:
- 第二条命令不依赖于第一条命令,如果第一条命令失败,您仍希望运行第二条命令,并且预计第二条命令的成功率不会受到影响。然后,您通常会
;
在脚本的不同行中使用或放置它们。 - 第二个命令完全依赖于第一个命令,因此如果第一个命令失败,则尝试第二个命令是没有意义的,或者会造成危害。然后您将需要使用
&&
来将它们分开。
顺便说一下,还有一个||
运算符。仅当第一个命令失败的而不是只有成功时才执行(就像 一样&&
):
first-command || second-command
||
不应与|
在命令之间设置管道相混淆。