&&和;和有什么区别?什么时候分叉睡觉到背景?


8

我刚刚问了一个有关在后台中休眠的过程的问题
我自己想到的符号如下所示:

sleep 10 && echo "hello world" &

这个对不同问题的答案使用了不同的格式。

( sleep 10 ; echo "hello world" ) &

我知道,&&如果第一个过程返回true ,则仅允许第二个过程开始。睡眠会失败吗?有没有一种情况我应该优先选择另一种情况?


Answers:


12

如果睡眠在执行期间终止,则睡眠可能失败:

$ sleep 2
$ echo "$?"
0
$ sleep 2
^C
$ echo "$?"
130

由于sleep是一个外部可执行文件,因此也可以想象fork或exec调用可能失败,这也将导致bash生成错误代码> 0。


5

a; b总是在第二条命令之后执行第二条命令,而a && b仅在第一条命令成功的情况下(即仅在第一条命令返回状态0时)才运行第二条命令。

sleep始终返回状态0,除非被信号杀死,在这种情况下,状态为128 +信号编号。(如果sleep命令不存在或由于资源不足而无法启动程序,则状态也可以是126或127 ,但是您极不可能遇到这些情况。)

因此,如果睡眠中断,您应该使用;&&根据想要发生的情况进行操作:

  • sleep 10; echo hello10秒钟后打印消息(如果sleep被信号杀死则更少);
  • sleep 10 && echo hello10秒钟后打印消息,但是如果sleep被信号杀死则不打印任何消息。

3

您应该假定任何命令都可能由于各种原因而失败,即使确实不可能出现睡眠失败。

( sleep 10 ; echo "hello world" ) &

表示后台睡眠并在睡眠过程后执行回显,但是如果睡眠失败,回显将继续运行, 请参见完整说明

sleep 10 && echo "hello world" &

意味着您需要等到睡眠结束后再回显任何内容,如果回显失败,则该过程将停止,但整个命令也将处于后台。看到完整的解释

结束语
第一种语法是shell脚本,这意味着它将脚本作为列表单独考虑。
第二个选项使用&&表示AND,因此如果在第一个命令失败的情况下使用它,则第二个将不会执行。

这只是处理错误的不同行为。


@terdon感谢您的编辑,我的帖子确实写得非常好
Kiwy 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.