&&と;の違いは何ですか?睡眠はいつ背景に分岐しますか?

&&と;の違いは何ですか?睡眠はいつ背景に分岐しますか?

今止まる質問をしたバックグラウンドでスリーププロセスを分岐することに関連しています。
私が自分で思いついた表記法は次のとおりです。

sleep 10 && echo "hello world" &

この回答質問ごとに異なる形式を使用してください。

( sleep 10 ; echo "hello world" ) &

&&2番目のプロセスの開始は、1番目のプロセスがtrueを返す場合にのみ許可されることを知っています。睡眠が失敗する可能性がありますか?他のものより1つを選択する必要がある状況はありますか?

答え1

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

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

sleepは外部実行可能ファイルなので、forkまたはexec呼び出しも失敗する可能性があり、これによりbashはエラーコード> 0を生成します。

答え2

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

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番目のコマンドは実行されません。

エラーを処理するときの動作は異なります。

関連情報