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

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

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リスト機能をどのように活用しますか?

答え1

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

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

これに関してPOSIXではありませんdashtrapPOSIX には以下が必要です。それ:

var=$(trap)

トラップがサブシェルからリセットされない特別なケースと見なされます。

zshそして、mkshこのような問題もあります。ただし、zsh次のことができます。

trap | IFS= read -rd '' traps

関連情報