ダッシュマンページ の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
のリスト機能を利用できますか?
一時ファイルにリダイレクトできます。
file=$(mktemp) || exit
{
rm -f -- "$file"
trap
traps=$(cat)
} > "$file" < "$file"
その点で、dash
のtrap
はPOSIXではないことに注意してください POSIXには必要です 次のようになります。
var=$(trap)
トラップがサブシェルでリセットされない特殊なケースとして扱われます。
zsh
とmksh
にも問題があります。ただし、zsh
では、次のことができます。
trap | IFS= read -rd '' traps