私は「保証された」または「最終的な」意味でトラップを使用する慣用的なパターンを探しているので、bash関数がどのように終了するかに関係なく実行する必要があります。
トラップを見つけRETURN
ましたが、入れ子になるのはマイナーな問題ではありません。私はbarのトラップがfooのトラップを隠すと思います。foo
両方にトラップを設定するにはどうすればよいですか?bar
foo
したがって、次のコードが与えられたら、終了および終了時に整理したいと思いますbar
。
最初の試みは、グローバル文字列を使用してクリーンアップ操作を保存することでしたが、サブシェルがあるたびにその文字列が失われました。次のコードの出力では、RETURN信号も "shell-global"であるように見えます。
fooclear() { echo fooclear; }
barclear() { echo barclear; }
bar() {
echo bar
trap barclear RETURN INT ERR TERM EXIT
sleep 1
}
foo() {
echo foo
sleep 1
trap fooclear RETURN INT ERR TERM EXIT
bar
}
for i in 1 2 3; do
foo &
done
wait
もう1つ注意する:重複処理を防ぐために、削除機能が完了した後に何らかの方法で管理する必要があります。
答え1
この記事はどこにも見つかりませんが、次のように追加されているようです。
trap - RETURN
トラップハンドラの最後のコマンドになると、トラップは前のコマンドに戻ります(どこかに複数のbash
ハンドラRETURN
を残します。ドキュメントには通常、トラップがデフォルト値にtrap - {SIGSPEC}
戻ることがわかります。この場合、デフォルト値は "Shadow"のようです)トラップコマンド。