今天我打开了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 如果出现严重问题(例如,无法访问命令行参数)。