オプション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
、コマンドが実行される前に信号が無視されていると思います。source
trap
シェルへのエントリ時に無視されたシグナルは、トラップまたはリセットできません。
その結果、trap
コマンドは実行されますが、トラップ自体は登録されないため、起動しません。