在教程和操作指南中,我经常看到组合命令。例如,
sudo apt-get update && sudo apt-get install pyrenamer
似乎有四种可能的连接器:&
、&&
和。虽然连接器对我||
来说 很清楚(它将进程发送到后台并使终端可用),但不清楚和之间的区别是什么。直到 Kaya 的评论我才知道。;
&
&&
;
||
以下问题涉及两个连接器之间的差异,但大多是在评论中涉及的:
以下是一些相关问题:
答案1
备忘单:
A; B # Run A and then B, regardless of success of A
A && B # Run B if and only if A succeeded
A || B # Run B if and only if A failed
A & # Run A in background.
答案2
&&
仅当第一个命令以状态 0 退出(成功)时才运行第二个命令。;
运行两个命令,即使第一个命令以非零状态退出。
你的例子&&
可以等效地解释为
if sudo apt-get update ; then
sudo apt-get install pyrenamer
fi
答案3
;
无论第一个命令是否成功,使用都会执行命令。
&&
仅当第一个命令成功执行(状态 0)时,才会执行第二个命令。
两者的使用角度不同。例如,对于较长的过程,例如安装,您需要编译并安装它。您应该。因此,只有成功make && make install
后安装才会运行。make
因此对于依赖命令您应该使用&&
。
运行 bash,或者使用具有独立命令的命令,使用;
。
因此,如果您想关闭计算机,即使第一项工作失败,也可以使用;
,但如果希望第一项工作完全成功,则启动关机使用&&
。
答案4
杰克的回答是非常好的经验法则。
A; B # Run A and then B, regardless of success of A A && B # Run B if and only if A succeeded A || B # Run B if and only if A failed A & # Run A in background.
我想补充一点,在某些情况下,当我们想将它们视为一个单元,或者我们不想将某些操作结果与当前 shell 耦合时,在子 shell 中使用这些命令是有意义的。
例子:
连接两个命令的输出:
(ls foo; ls bar) > single-result.txt
进入一个目录并从那里执行命令而不改变 shell 的当前目录:
(cd target-directory && jar -xf ../my-jar)