为什么是“while kill -0 $PID”而不是“直到kill -0 $PID”?

Cla*_*diu 6 linux scripting bash shell-script exit

我可能在这里很愚蠢,但是如果我想在进程运行时做某事,为什么要这样做:

while kill -0 $PID
do
    #...
done
Run Code Online (Sandbox Code Playgroud)

代替

until kill -0 $PID
do
    #...
done
Run Code Online (Sandbox Code Playgroud)

?

kill -01如果未找到该进程,则以代码退出,并且0如果找到该进程:

$ kill -0 123444
-bash: kill: (123444) - No such process
$ echo $?
1
$ screen -ls | grep rofl
    28043.rofl  (02/19/2015 02:27:56 PM)    (Detached)
$ kill -0 28043
$ echo $?
0
Run Code Online (Sandbox Code Playgroud)

因此,如果进程正在运行,while 循环不会归结为:

while 0
do
    #...
done
Run Code Online (Sandbox Code Playgroud)

哪个永远不会执行?

jor*_*anm 7

处理返回代码时,“0”表示成功,非零表示失败。while 循环的语法是:

while COMMANDS; do ...; done
Run Code Online (Sandbox Code Playgroud)

while语句检查提供的命令列表中最后一个命令的返回码。在你的最后一个例子中while 0,这将尝试执行一个名为“0”的命令并检查它的返回码。

文字 0 在算术上下文之外对于 bash 来说并不特殊。在该上下文中,0认为是错误的。例如

while (( 0 )); do
  ... # never executes
end
Run Code Online (Sandbox Code Playgroud)

这种情况很特殊,因为关键字((被视为命令,它返回非零,因为它的结果是 0。


cuo*_*glm 5

外壳不会像您想象的那样展开。

在 shell 中,错误代码0表示命令已成功完成。任何非零错误代码表示存在错误。

更简洁地说,POSIX 将while 循环定义为:

只要另一个复合列表的退出状态为零,while 循环就会连续执行一个复合列表。

while循环的格式如下:

while compound-list-1
do
    compound-list-2
done
Run Code Online (Sandbox Code Playgroud)

将执行复合列表 1,如果它具有非零退出状态,则 while 命令将完成。否则,应执行复合列表 2,并重复该过程。


小智 5

“while”命令不是在寻找布尔值,而是在寻找指示命令成功执行的返回码“0”。所以在 while 命令的情况下,返回 0 的命令是“真”,其他任何东西都是“假”。

即使在进行比较时,Bash 也会将其视为一个命令,当比较为真时,该命令返回成功的错误代码 (0)。