なぜ「untilkill-0$PID」の代わりに「whilekill-0$PID」を使用するのですか?

なぜ「untilkill-0$PID」の代わりに「whilekill-0$PID」を使用するのですか?

ここで私は愚かかもしれませんが、プロセスの実行中に何かをしたい場合は、なぜこれを行う必要がありますか?

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

変える

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

kill -010プロセスが見つからない場合は、プロセスが見つかった場合はコードで終了します。

$ 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の観点から見ると、否定的な論理と考えているのです。

関連情報