哪一个更好:使用 ; 还是 && 在一行中执行多个命令?

哪一个更好:使用 ; 还是 && 在一行中执行多个命令?

在教程和操作指南中,我经常看到组合命令。例如,

sudo apt-get update && sudo apt-get install pyrenamer

似乎有四种可能的连接器:&&&和。虽然连接器对我||来说 很清楚(它将进程发送到后台并使终端可用),但不清楚和之间的区别是什么。直到 Kaya 的评论我才知道。;&&&;||

以下问题涉及两个连接器之间的差异,但大多是在评论中涉及的:

以下是一些相关问题:

  1. ;和有什么区别&&
  2. 何时应使用它们分别是什么?如果能看到一些用例就好了:如果我想运行一个命令,然后在它关闭我的计算机后,我应该选择哪个连接器?
  3. 他们的优点危险罗比·巴萨克在评论中提到这个答案cd /somewhere_else; rm -Rf *例如,如果命令链中的第一个元素失败,则类似的命令可能产生破坏性的后果。
  4. 如果相关,它们来自哪里?

答案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)
    

相关内容