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

在教程和操作方法中,我经常看到命令组合在一起。 例如,

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

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

以下问题涉及两个连接器之间的区别,但主要在注释中这样做:

  • 如何一次启动两个Ubuntu应用程序?

  • 如何在终端中组合多个命令?

所以这里有一些相关的问题:

  1. 有什么区别;&&
  2. 你应该什么时候分别使用它们 ? 很高兴看到一些用例:如果我想运行命令然后关闭我的计算机,我应该选择哪个连接器?
  3. 他们的优点危险是什么? Robie Basak在对这个答案的评论中提到了像cd /somewhere_else; rm -Rf *这样的命令cd /somewhere_else; rm -Rf * 例如,如果命令链中的第一个元素发生故障,则cd /somewhere_else; rm -Rf *会产生破坏性后果。
  4. 如果相关,它们来自哪里?

cheatsheet文件:

 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. 

如果第一个命令以状态0退出(成功),则&&仅运行第二个命令。 ; 即使第一个命令以非零状态退出,也会运行这两个命令。

你和&&例子可以等同地解释为

 if sudo apt-get update ; then sudo apt-get install pyrenamer fi 

使用; 无论第一个命令是否成功,都将执行命令。

仅在第一个命令成功执行时使用&&执行第二个命令(状态0)。

两者都用于不同的视角。 对于更长的过程,比如安装,您需要编译和安装它。 你应该make && make install 。 所以安装只有在成功时才会运行。

所以对于依赖命令,你应该使用&&

Wring bash,或使用独立命令的命令;

因此,如果您想要关闭计算机,即使第一个作业失败使用; ,但如果想要第一份工作的完全成功启动关机使用&&

a ; b 无论a的退出状态如何, a ; b都将运行b。 a && b只有在成功的情况下才会运行b。

这对于回答前3个问题是必要且充分的。 特别是,2太宽泛,不能给出“一个”明确的答案 – 你最好的选择是根据具体情况来决定。

至于第四个问题: 它们是Bash语法 。

使用任何一种都没有内在的危险。 同样,上面的定义就足够了。 这意味着如果a没有成功,你会在b有非预期效果的时候写&& 。 恕我直言,没有必要进一步的规则或解释。