私はここで気が狂っているかもしれませんが、プロセスの実行中に何かをしたいのなら、なぜ私はするのですか?
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
どちらが実行されることはありませんか?
戻りコードを処理する場合、「0」は成功であり、ゼロ以外は失敗です。 whileループの構文は次のとおりです。
while COMMANDS; do ...; done
while
ステートメントは、提供されたコマンドのリストの最後のコマンドの戻りコードをチェックします。 while 0
の最後の例では、これは「0」というコマンドを実行し、その戻りコードを確認しようとします。
リテラル0は、算術コンテキスト外でのbashに特別なものではありません。そのコンテキスト内では、0 isはfalseと見なされます。例えば
while (( 0 )); do
... # never executes
end
キーワード((
はコマンドとして扱われ、結果が0であるためゼロ以外を返すため、このケースは特別です。
シェルはあなたが思うように状態を拡張しません。
シェルでは、エラーコード0
は、コマンドが正常に完了したことを示します。ゼロ以外のエラーコードは、エラーがあったことを示しています。
より簡潔に言うと、POSIXは whileループ を次のように定義します。
Whileループは、別の複合リストの終了ステータスがゼロである限り、1つの複合リストを継続的に実行します。
Whileループの形式は次のとおりです。
while compound-list-1
do
compound-list-2
done
複合リスト-1が実行され、終了ステータスがゼロ以外の場合、whileコマンドが完了します。それ以外の場合は、compound-list-2が実行され、プロセスが繰り返されます。
「while」コマンドはブール値を探していませんが、コマンドが正常に実行されたことを示す「0」の戻りコードを探しています。したがって、whileコマンドの場合、0を返すコマンドは「true」であり、それ以外のコマンドは「false」です。
比較を行っている場合でも、Bashは、比較がtrueの場合に成功したエラーコード(0)を返すコマンドのように扱います。
終了コードはブール値ではなく、整数です。慣例により、ゼロ値は成功です。したがって、Bashの観点から負の論理で考えています。