当上一个命令完成时运行另一个命令

Abh*_*mal 10 command-line bash syntax

今天我打开gnome-terminal并写了

ls && sleep 4 && gnome-terminal
Run Code Online (Sandbox Code Playgroud)

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

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

ls -lR && sleep 4 && gnome-terminal
Run Code Online (Sandbox Code Playgroud)

该命令ls -lR在 3 秒后完成,但之后没有任何命令sleep 4gnome-terminal成功运行。

问题是什么?

vid*_*rlo 25

&&表示如果前一个命令成功则运行它。在 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
Run Code Online (Sandbox Code Playgroud)

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

在第二个例子中,我 ls 已经存在一个文件,所以 ls 以 0 作为退出状态退出,并且命令被执行。

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

 command1; command2; command3 
Run Code Online (Sandbox Code Playgroud)

等等。

因此你可以这样做

ls -lR ; sleep 4 ; gnome-terminal
Run Code Online (Sandbox Code Playgroud)

除了&&and ;you have||这与以下相反&&:仅当上一个命令失败且退出状态为非零时才运行该命令。如果第一个命令成功,则不会执行下一个命令。如果失败,将执行下一个。

简而言之:

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

  • 我认为它就像 0 意味着成功,这就像真的。 (7认同)
  • @KodosJohnson 在 C 世界中,0 表示成功,因为非零表示错误,并且可能有数百个错误代码(参见 `error.h`)。快乐返回码都是一样的...... (4认同)
  • @AbhishekKamal 不,我无法在我的机器上尝试。ls -lR * 应该* 工作,但如果它例如点击一个它没有权限查看的目录,它可能会失败。例如,`ls -lR /` 总是会失败...... (4认同)
  • @JonBentley “echo'd”中的“echo”是命令的名称,而不是英语动词,即使它碰巧拼写相同,所以它应该如何共轭还是有些问题。如果您选择其他命令,这一点会更加明显:例如,`ls` 的过去式是什么? (2认同)
  • @chrylis:不,关键是“0 表示真”_not_它是“在 C 世界中”的样子。在 C 编程语言中,条件(和逻辑运算符)认为 0 为假,其他一切都为真。shell 中进程退出代码的约定正好相反。-- 尽管 C 和 shell 都是更大的 Unix 传统的一部分。 (2认同)

moo*_*765 12

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

来自man bash

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

来自man ls

退出状态:
       0 如果正常,
       1 如果小问题(例如,无法访问子目录)
       2 如果出现严重问题(例如,无法访问命令行参数)。