web-dev-qa-db-ja.com

非同期サブシェル出口の処理方法

私がこれを持っていると言う:

set -e;

(
    docker stop notifier-server
    docker rm -f notifier-server
    exit 1  # explicitly exit with non-zero
) &

wait;

echo 'we are here now'

サブシェルがゼロ以外で終了した場合でも、常にエコーラインに到達しますか?それはバックエンドプロセス/サブシェルなので、私はそう思いますか?

これを見る正しい方法は何ですか?

5
zambiazzz

ゼロ以外の終了ステータスは返されませんなので、コードは現在のシェルセッションを終了しません。バックグラウンドジョブを開始するシェルの呼び出しの結果は常にゼロです。

wait "$!"またはwait -n( "次のジョブが終了するのを待つ")を使用した場合、waitが返されるため、シェルセッションwouldは終了します。待機していたジョブの終了ステータス。ゼロ以外です。

bashhelp waitを参照してください。

3
Kusalananda

バックグラウンドプロセスであるプロセスとは関係ありません。waitコマンドの終了ステータスと関係があります。

help waitから:

IDが指定されていない場合、現在アクティブなすべての子プロセスを待機し、戻りステータスはゼロです。

$ 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
4
RalfFriedl