私がこれを持っているとしましょう:
set -e;
(
docker stop notifier-server
docker rm -f notifier-server
exit 1 # explicitly exit with non-zero
) &
wait;
echo 'we are here now'
サブシェルがゼロ以外の値で終了しても、常にエコーラインに到達しますか?バックエンドプロセス/サブシェルなので、そうです。
この問題を見る正しい方法は何ですか?
答え1
プロセスがバックグラウンドプロセスであるかどうかには関係がなく、wait
コマンドの終了状態に関連しています。
からhelp wait
:
IDが指定されていない場合は、現在アクティブなすべての子プロセスが待機し、ステータス0が返されます。
$ bash -exc '(sleep 1; exit 1) & wait ; echo done'
+ wait
+ sleep 1
+ exit 1
+ echo done
done
-nオプションが指定されている場合は、次のジョブが終了するのを待って終了ステータスを返します。
$ bash -exc '(sleep 1; exit 1) & wait -n; echo $?:done'
+ wait -n
+ sleep 1
+ exit 1
答え2
あなたのコードは現在シェルセッションを終了しません。ゼロ以外の終了ステータスが返されませんでした。。バックグラウンド操作を開始する呼び出しシェルの結果は常にゼロです。
wait "$!"
または(「次の操作が完了するまで待機」)を使用した場合は、wait -n
シェルセッション会議wait
待っていたジョブのゼロ以外の終了ステータスが返されたため、中止されました。
で確認help wait
済みbash