问题描述
在教程和how-to中,我经常看到命令的组合。例如,
sudo apt-get update && sudo apt-get install pyrenamer
似乎有四种可能的连接器:&
,&&
,||
和;
。虽然&
连接器对我来说很清楚(它向后台发送进程并使终端可用),但不清楚&&
和;
之间的区别。在Kaya的评论之前我不知道||
。
以下问题处理两个连接器之间的差异,但主要在评论中这样做:
所以这里有一些相关的问题:
-
;
和&&
有什么区别? -
你应该什么时候分别使用它们?看到一些用例会很高兴:如果我想运行一个命令,然后关闭计算机,我应该选择哪个连接器?
-
他们的优点和危险是什么? Robie Basak在对this answer的评论中提到,例如,如果命令链中的第一个元素失败,像
cd /somewhere_else; rm -Rf *
这样的命令可能会产生破坏性后果。 -
如果相关,他们从哪里来?
最佳解决方法
cheatsheet文件:
A; B Run A and then B, regardless of success of A
A && B Run B if A succeeded
A || B Run B 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
。所以只有在make
成功的情况下安装才会运行。
因此,对于从属命令,您应该使用&&
使用;
或使用独立命令执行命令bash或命令
因此,如果您想关闭计算机,即使第一个作业失败,也可以使用;
,但如果想在第一个作业完成时启动关闭,请使用&&
第四种方法
无论a的退出状态如何,a ; b
都将运行b。 a && b
只有在成功时才会运行b。
这对于回答前三个问题是必要和充分的。特别是,2太宽泛了,不能给”one”明确的答案 – 你最好的选择是根据具体情况来决定。
至于第四个问题:They’re Bash syntax。
使用其中也没有内在的危险。再次,上面的定义是足够的。这意味着,如果a
不成功,那么当b
发生意外影响时,您将编写&&
。恕不另行规定或解释,恕我直言。