![&& 和 ; 之间有什么区别?什么时候将睡眠分叉到后台?](https://linux22.com/image/51606/%26%26%20%E5%92%8C%20%3B%20%E4%B9%8B%E9%97%B4%E6%9C%89%E4%BB%80%E4%B9%88%E5%8C%BA%E5%88%AB%EF%BC%9F%E4%BB%80%E4%B9%88%E6%97%B6%E5%80%99%E5%B0%86%E7%9D%A1%E7%9C%A0%E5%88%86%E5%8F%89%E5%88%B0%E5%90%8E%E5%8F%B0%EF%BC%9F.png)
答案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 hello
10 秒后打印消息(如果sleep
被信号杀死则更少);sleep 10 && echo hello
10 秒后打印消息,但如果sleep
被信号杀死则不打印任何内容。
答案3
您应该假设任何命令都可能因各种原因而失败,即使睡眠失败的可能性确实很小。
( sleep 10 ; echo "hello world" ) &
意味着后台睡眠并在睡眠过程后执行 echo 但如果睡眠失败 echo 无论如何都会运行 查看完整的解释
sleep 10 && echo "hello world" &
意味着您需要等待睡眠结束才能回显任何内容,如果回显失败,进程将停止,但整个命令也会在后台运行。查看完整的解释
结论
第一个语法是 shell 脚本,这意味着它将指令单独视为列表。
第二个选项使用 && 表示 AND,因此如果您在第一个命令失败时使用它,则第二个命令将不会被执行。
这只是处理错误时的不同行为。