web-dev-qa-db-ja.com

ダッシュ:トラップの出力をキャプチャする方法(引数なしで呼び出されます)?

ダッシュマンページtrapのセクションには、次のように記載されています。

trap引数なしで、シグナルとそれに関連するアクションのリストをの形式で標準出力に書き込みます。同じトラップ結果を達成するシェルへの入力として適しています

驚くばかり! trapの出力をコマンドとしてシェルにフィードバックすることで、オーバーライドした以前のシグナルハンドラーを復元する簡単な方法を見つけたと思いました。

_trap "echo 'good'" EXIT

# save signal handlers to $traps
traps="$(trap)"

# override EXIT handler
trap "echo 'bad'" EXIT

# reinstate original handlers
eval "$traps"
_

必要な出力:good

実際の出力:bad

_$traps_は空であるため、これは完全に論理的です。これは、マンページと一致しています。

シェルがサブシェルをフォークオフすると、トラップされた(ただし無視されない)信号がデフォルトのアクションにリセットされます。

(コマンド置換$(trap)はサブシェルをフォークするため、trapはシグナルハンドラーを認識しません。)


すべてが正常に動作しているようです。しかし、どうすればtrapのリスト機能を利用できますか?

5
Kontrollfreak

一時ファイルにリダイレクトできます。

file=$(mktemp) || exit
{
  rm -f -- "$file"
  trap
  traps=$(cat)
} > "$file" < "$file"

その点で、dashtrapはPOSIXではないことに注意してください POSIXには必要です 次のようになります。

var=$(trap)

トラップがサブシェルでリセットされない特殊なケースとして扱われます。

zshmkshにも問題があります。ただし、zshでは、次のことができます。

trap | IFS= read -rd '' traps
4