答案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,因此如果您在第一个命令失败时使用它,则第二个命令将不会被执行。
这只是处理错误时的不同行为。