![为什么是“whilekill-0$PID”而不是“untilkill-0$PID”?](https://linux22.com/image/61167/%E4%B8%BA%E4%BB%80%E4%B9%88%E6%98%AF%E2%80%9Cwhilekill-0%24PID%E2%80%9D%E8%80%8C%E4%B8%8D%E6%98%AF%E2%80%9Cuntilkill-0%24PID%E2%80%9D%EF%BC%9F.png)
我在这里可能很愚蠢,但是如果我想在进程运行时做某事,为什么我要这样做:
while kill -0 $PID
do
#...
done
代替
until kill -0 $PID
do
#...
done
?
kill -0
1
如果未找到进程,则退出并显示代码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 的角度来看,您正在以负逻辑思考