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 4并gnome-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 退出,则运行 ;: 无条件运行||:如果前面的命令以非零退出状态退出,则运行。&:并行运行两个命令,第一个在后台,第二个在前台。moo*_*765 12
命令ls -lR以非零的退出状态退出,因此未执行以下命令。很可能ls无法打开子目录。它没有发生在您的第一个命令中,因为您没有使用 - 选项-R。
来自man bash:
命令 1 && 命令 2
当且仅当 command1 返回退出状态时才执行 command2
零。
来自man ls:
退出状态:
0 如果正常,
1 如果小问题(例如,无法访问子目录)
2 如果出现严重问题(例如,无法访问命令行参数)。