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

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

我刚刚问了一个问题关于分叉一个进程以在后台休眠。
我自己想出的符号如下所示:

sleep 10 && echo "hello world" &

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

( sleep 10 ; echo "hello world" ) &

我知道&&只有第一个进程返回 true 时才允许启动第二个进程。睡眠会失败吗?在某种情况下我应该选择其中一种而不是另一种吗?

答案1

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

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

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

答案2

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" ) &

意味着后台睡眠并在睡眠过程后执行 echo 但如果睡眠失败 echo 无论如何都会运行 查看完整的解释

sleep 10 && echo "hello world" &

意味着您需要等待睡眠结束才能回显任何内容,如果回显失败,进程将停止,但整个命令也会在后台运行。查看完整的解释

结论
第一个语法是 shell 脚本,这意味着它将指令单独视为列表。
第二个选项使用 && 表示 AND,因此如果您在第一个命令失败时使用它,则第二个命令将不会被执行。

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

相关内容