web-dev-qa-db-ja.com

「殺すまで-0 $ PID」ではなく、「殺す間-0 $ PID」なのはなぜですか?

私はここで気が狂っているかもしれませんが、プロセスの実行中に何かをしたいのなら、なぜ私はするのですか?

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

どちらが実行されることはありませんか?

6
Claudiu

戻りコードを処理する場合、「0」は成功であり、ゼロ以外は失敗です。 whileループの構文は次のとおりです。

while COMMANDS; do ...; done

whileステートメントは、提供されたコマンドのリストの最後のコマンドの戻りコードをチェックします。 while 0の最後の例では、これは「0」というコマンドを実行し、その戻りコードを確認しようとします。

リテラル0は、算術コンテキスト外でのbashに特別なものではありません。そのコンテキスト内では、0 isはfalseと見なされます。例えば

while (( 0 )); do
  ... # never executes
end

キーワード((はコマンドとして扱われ、結果が0であるためゼロ以外を返すため、このケースは特別です。

7
jordanm

シェルはあなたが思うように状態を拡張しません。

シェルでは、エラーコード0は、コマンドが正常に完了したことを示します。ゼロ以外のエラーコードは、エラーがあったことを示しています。

より簡潔に言うと、POSIXは whileループ を次のように定義します。

Whileループは、別の複合リストの終了ステータスがゼロである限り、1つの複合リストを継続的に実行します。

Whileループの形式は次のとおりです。

while compound-list-1
do
    compound-list-2
done

複合リスト-1が実行され、終了ステータスがゼロ以外の場合、whileコマンドが完了します。それ以外の場合は、compound-list-2が実行され、プロセスが繰り返されます。

5
cuonglm

「while」コマンドはブール値を探していませんが、コマンドが正常に実行されたことを示す「0」の戻りコードを探しています。したがって、whileコマンドの場合、0を返すコマンドは「true」であり、それ以外のコマンドは「false」です。

比較を行っている場合でも、Bashは、比較がtrueの場合に成功したエラーコード(0)を返すコマンドのように扱います。

5

終了コードはブール値ではなく、整数です。慣例により、ゼロ値は成功です。したがって、Bashの観点から負の論理で考えています。

2
xae