ここで私は愚かかもしれませんが、プロセスの実行中に何かをしたい場合は、なぜこれを行う必要がありますか?
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」は成功を示し、0以外の場合は失敗を示します。 whileループの構文は次のとおりです。
while COMMANDS; do ...; done
このwhile
ステートメントは、提供されたコマンドのリストで最後のコマンドの戻りコードを確認します。最後の例では、while 0
「0」というコマンドを実行し、対応する戻りコードを確認しようとします。
リテラルゼロは、算術文脈の外でbashするために特別ではありません。この文脈では、0はい偽物とみなされます。例えば
while (( 0 )); do
... # never executes
end
この場合は、キーワードが((
コマンドとして扱われ、結果がゼロであるため、ゼロ以外の値を返すので、特別です。
答え2
シェルは思ったほど拡張されません。
シェルでは、エラーコードは0
コマンドが正常に完了したことを示します。ゼロ以外のエラーコードはエラーを示します。
簡略化のため、POSIX は以下を定義します。whileループように:
whileループは、他の複合リストの終了状態が0である限り、複合リストを継続して実行する必要があります。
whileループの形式は次のとおりです。
while compound-list-1
do
compound-list-2
done
complex-list-1 が実行され、終了ステータスが 0 でない場合、while コマンドは完了します。それ以外の場合は、complex-list-2が実行され、プロセスが繰り返されます。
答え3
ブール値を検索する代わりに、コマンド「while」は、コマンドが正常に実行されたことを示す戻りコード「0」を探します。したがって、while命令の場合、0を返す命令は「true」であり、その他の値は「false」である。
比較をしていても、Bashは比較が真の場合に成功エラーコード(0)を返すコマンドと見なします。
答え4
終了コードはブール値ではなく整数であり、通常、ゼロ値は成功を示します。したがって、Bashの観点から見ると、否定的な論理と考えているのです。