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)
哪个永远不会执行?
处理返回代码时,“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。
外壳不会像您想象的那样展开。
在 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)。