&& 和 ; 和有什么区别?何时将睡眠分叉到后台?

Baa*_*arn 8 shell sleep background-process

我刚刚问了一个关于将进程分叉到后台睡眠的问题
我自己想出的符号是这样的:

sleep 10 && echo "hello world" &
Run Code Online (Sandbox Code Playgroud)

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

( sleep 10 ; echo "hello world" ) &
Run Code Online (Sandbox Code Playgroud)

我知道&&只有在第一个进程返回 true 时才允许第二个进程启动。睡眠会失败吗?是否存在我应该更喜欢其中一种的情况?

Chr*_*own 12

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

$ sleep 2
$ echo "$?"
0
$ sleep 2
^C
$ echo "$?"
130
Run Code Online (Sandbox Code Playgroud)

由于sleep是外部可执行文件,所以也可以想象fork或exec调用可能会失败,这也会导致bash产生>0的错误代码。


Gil*_*il' 5

a; b总是在第一个命令之后运行第二个命令,而a && b只有在第一个命令成功时才运行第二个命令,即只有当第一个命令返回状态 0 时。

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

因此,如果睡眠中断,您应该使用;&&取决于您想要发生的情况:

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