&&と;の違いは何ですか バックグラウンドに睡眠をフォークするとき?


8

私は背景で眠るようにプロセスをフォークすることについて質問しました。
私が思いついた表記は次のようになります。

sleep 10 && echo "hello world" &

別の質問に対するこの回答では、別の形式を使用しています。

( sleep 10 ; echo "hello world" ) &

&&最初のプロセスがtrueを返した場合にのみ、2番目のプロセスを開始できることを知っています。眠れませんか?どちらかを優先する必要がある状況はありますか?


回答:


12

実行中に終了すると、スリープが失敗する可能性があります。

$ sleep 2
$ echo "$?"
0
$ sleep 2
^C
$ echo "$?"
130

スリープは外部の実行可能ファイルであるため、forkまたはexec呼び出しが失敗し、bashが0を超えるエラーコードを生成することも考えられます。


5

a; bは常に最初のコマンドの後に2番目のコマンドをa && b実行しますが、最初のコマンドが成功した場合のみ、つまり最初のコマンドがステータス0を返した場合のみ、2番目のコマンドを実行します。

sleepシグナルによって強制終了された場合を除き、常にステータス0を返します。この場合、ステータスは128 +シグナル番号です。(sleepコマンドが存在しないか、リソース不足のためにプログラムを起動できない場合でも、ステータスは126または127になる可能性がありますが、これらのケースに遭遇する可能性はほとんどありません。)

したがって、スリープが中断された場合に使用する;か、または&&何をしたいかに応じて、以下を使用する必要があります。

  • sleep 10; echo hello10秒後にメッセージを出力します(sleepシグナルによって強制終了された場合は少なくなります)。
  • sleep 10 && echo hello10秒後にメッセージを出力しますがsleep、シグナルによって強制終了された場合は何も出力しません。

3

スリープに失敗する可能性が非常に低い場合でも、コマンドはさまざまな理由で失敗する可能性があると想定する必要があります。

( sleep 10 ; echo "hello world" ) &

バックグラウンドスリープを意味し、スリーププロセスの後にエコーを実行しますが、スリープが失敗した場合でもエコーが実行されます完全な説明を参照しください

sleep 10 && echo "hello world" &

何かをエコーする前にスリープの終了を待つ必要があることを意味します。エコーが失敗した場合、プロセスは停止しますが、コマンド全体もバックグラウンドで実行されます。詳細な説明を見る

結論
最初の構文はシェルスクリプトです。つまり、命令をリストとして個別に検討しています。
2番目のオプションは&&を使用し、ANDを使用するため、最初のコマンドが失敗した場合に2番目は実行されません。

これは、エラー処理における異なる動作です。


@terdon編集をありがとう、私の投稿は本当にひどく書かれていました
Kiwy 2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.