バッシュトラップ(RETURNトラップ)に陥る

バッシュトラップ(RETURNトラップ)に陥る

私は「保証された」または「最終的な」意味でトラップを使用する慣用的なパターンを探しているので、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"のようです)トラップコマンド。

おすすめ記事