オプションtrap.shを入れるように修正しました。xtrace
#!/bin/bash
set -x
trap 'echo trapped' EXIT
exit 0
trap.shスクリプトとして実行すると生成されます
~ $ ./trap.sh | 猫 + トラップ「エコー トラップ」 EXIT + 終了 0 + エコー トラップ トラップ
ただし、最初に調達すると
~ $ . trap.sh | cat
++ trap 'echo trapped' EXIT
++ exit 0
これは、trapがより深いサブシェルで実行され (理由はわかりません)、トラップ自体は決して実行されないことを示しています (2 番目の実験でtouchは、単にエコーするのではなく、トラップにファイルを ing することで確認しました。継承される標準出力の問題でした; ファイルはまったく変更されませんでした)。
私の推測では、man ページのコマンドの説明からの次の文に基づいてEXIT、コマンドが実行される前に信号が無視されていると思います。sourcetrap
シェルへのエントリ時に無視されたシグナルは、トラップまたはリセットできません。
その結果、trapコマンドは実行されますが、トラップ自体は登録されないため、起動しません。