コンテクスト:
私が持っていると言う:
(
#outer subshell
{
#inner command group, pipe-connected to ensure simultaneous invocation
do_first_thing
#die, somehow
} | {
#inner command group, pipe-connected to ensure simultaneous invocation
sleep 10
do_second_thing
}
)
echo "out"
私は外側のサブシェルを持っています(1つである必要はありません。コマンドグループにすることも、完全に削除することもできます)。その中に、同時に呼び出される2つのパイプ接続されたコマンドグループがあります。両方のグループの実行を開始し、最初のグループが終了したら(2番目のグループはまだ実行中です)、行がある場所で外側のサブシェルのsleep
実行を停止します。#die, somehow
質問:
#die, somehow
行に到達すると、レベル内のすべてが#outer subshell
終了し、その後も実行が継続される(つまりout
、印刷される)ようにするにはどうすればよいですか?
私が試したこと:
1つの解決策はkill 0
、両方の内部コマンドグループから抜け出すために(現在のプロセスグループ内のすべてを強制終了する)を使用することですが、そうするとecho "out"
決して起こりません。外側のサブシェルだけでなく、グループ全体が殺されます。
unset
また、関数を一時的にオーバーライドしてからオーバーライドしようとしましexit
たが、それは問題を別の場所にプッシュしているようです。おそらく私はそれを間違っています。私は決してBashの第一人者ではありません。
なんで?
&
プロセスをフォークアウトするために使用することは私のシステム(* nixに埋め込まれている)では決定論的に機能しないため、あまり詳細に立ち入ることなく、奇妙なサブシェル接続コマンドグループが必要です。その結果、パイプ接続されたグループは、do_first_thing
実行時間が長すぎる場合(上記の例では10秒)にdo_second_thing
発生することを保証します。実際のユースケースはかなり複雑ですが、これが問題の根本です。
乾杯!