前一个命令完成后运行另一个命令

前一个命令完成后运行另一个命令

今天我打开了gnome-terminal,我写道

ls && sleep 4 && gnome-terminal

在命令完成后打开另一个终端ls并等待 4 秒。因此,在之前的命令完全运行(包括)
后,它成功打开了一个新终端。sleep 4

之后,下次我输入新命令时

ls -lR && sleep 4 && gnome-terminal

该命令ls -lR在 3 秒后完成,但此后所有命令均未成功sleep 4运行gnome-terminal

问题是什么?

答案1

&&表示如果前一个命令成功则运行该命令。在 Unix 中,这通常表示退出状态 0。

$ ls barfoofba && echo "This will not be echo'd"
ls: cannot access 'barfoofba': No such file or directory
$ ls bar && echo "This will be echo'd"  
This will be echo'd

在第一个实例中,ls没有成功,因此它以非零退出状态退出,并且 bash 没有运行第二个命令。

在第二个例子中,我 ls 了一个现有文件,因此 ls 以 0 作为退出状态退出,并且命令被执行。

如果你想无条件地运行命令,例如不依赖于第一个命令的结果,你可以;像这样将它们分开

 command1; command2; command3 

等等。

因此你可以这样做

ls -lR ; sleep 4 ; gnome-terminal

除了 之外&&,您;还有||,它与 正好相反&&:仅当上一个命令以非零退出状态失败时才运行该命令。如果第一个命令成功,则不会执行下一个命令。如果失败,则将执行下一个命令。

简而言之:

  • &&:如果前面的命令以 0 退出,则运行
  • ;:无条件运行
  • ||:如果前面的命令以非零退出状态退出,则运行。
  • &:并行运行两个命令,第一个命令在后台运行,第二个命令在前台运行。

答案2

该命令ls -lR以非零的退出状态退出,因此以下命令尚未执行。很可能ls无法打开子目录。这在您的第一个命令中没有发生,因为您没有使用-R- 选项。

man bash

        命令1 && 命令2
       当且仅当 command1 返回退出状态时,才会执行 command2
       为零。

man ls

退出状态:
       如果可以,则为 0,
       如果是小问题(例如无法访问子目录)则为 1
       如果出现严重问题(例如,无法访问命令行参数)。

相关内容