バッシュトラップ(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"のようです)トラップコマンド。

答え2

そうですね。 RETURN シグナルは、すべてのシグナルと同様にシェル全体です。どんな信号でもつかむ変えるその信号に設定されているすべてのトラップは、おそらく「シャドウ」が意味するものです。

トラップはいくつかの簡単な例外処理を提供しますが、より強力な機能のためにこのスタックオーバーフローで質問に対する答えを確認します。キャッチしよう

関連情報