为什么是“whilekill-0$PID”而不是“untilkill-0$PID”?

为什么是“whilekill-0$PID”而不是“untilkill-0$PID”?

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

while kill -0 $PID
do
    #...
done

代替

until kill -0 $PID
do
    #...
done

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

因此,如果进程正在运行,那么 while 循环是否会归结为:

while 0
do
    #...
done

那么哪个永远不会执行?

答案1

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

while COMMANDS; do ...; done

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

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

while (( 0 )); do
  ... # never executes
end

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

答案2

外壳并没有像你想象的那样膨胀。

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

为了更简洁,POSIX 定义while 循环作为:

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

while循环的格式如下:

while compound-list-1
do
    compound-list-2
done

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

答案3

“while”命令不是寻找布尔值,而是寻找返回码“0”,这表明命令执行成功。因此,在 while 命令的情况下,返回 0 的命令是“真”,其他任何值都是“假”。

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

答案4

退出代码不是布尔值,而是整数,按照惯例,零值表示成功,因此从 Bash 的角度来看,您正在以负逻辑思考

相关内容