回答:
a; b
は常に最初のコマンドの後に2番目のコマンドをa && b
実行しますが、最初のコマンドが成功した場合のみ、つまり最初のコマンドがステータス0を返した場合のみ、2番目のコマンドを実行します。
sleep
シグナルによって強制終了された場合を除き、常にステータス0を返します。この場合、ステータスは128 +シグナル番号です。(sleep
コマンドが存在しないか、リソース不足のためにプログラムを起動できない場合でも、ステータスは126または127になる可能性がありますが、これらのケースに遭遇する可能性はほとんどありません。)
したがって、スリープが中断された場合に使用する;
か、または&&
何をしたいかに応じて、以下を使用する必要があります。
sleep 10; echo hello
10秒後にメッセージを出力します(sleep
シグナルによって強制終了された場合は少なくなります)。sleep 10 && echo hello
10秒後にメッセージを出力しますがsleep
、シグナルによって強制終了された場合は何も出力しません。スリープに失敗する可能性が非常に低い場合でも、コマンドはさまざまな理由で失敗する可能性があると想定する必要があります。
( sleep 10 ; echo "hello world" ) &
バックグラウンドスリープを意味し、スリーププロセスの後にエコーを実行しますが、スリープが失敗した場合でもエコーが実行されます完全な説明を参照して ください
sleep 10 && echo "hello world" &
何かをエコーする前にスリープの終了を待つ必要があることを意味します。エコーが失敗した場合、プロセスは停止しますが、コマンド全体もバックグラウンドで実行されます。詳細な説明を見る
結論
最初の構文はシェルスクリプトです。つまり、命令をリストとして個別に検討しています。
2番目のオプションは&&を使用し、ANDを使用するため、最初のコマンドが失敗した場合に2番目は実行されません。
これは、エラー処理における異なる動作です。