トラップが機能しない

トラップが機能しない

トラップを含むシェルスクリプトがありますが、トラップは期待通りに動作しないようです。以下はコードとbashバージョンです。

GNU bash、バージョン 4.2.46(2) リリース (x86_64-redhat-linux-gnu)

set -e
function exit_message(){
  echo -e "\e[31m\nError occurred "
}
function login(){
  false
}
trap exit_message ERR
login

上記のトラップは私が実行すれば機能します

function login(){
  trap exit_message ERR
  false
}

答え1

からbash マニュアル:

シェル実行環境のすべての側面は、関数とその呼び出し元の間で同一ですが、次の例外があります: 関数に組み込みをtrace使用して属性が指定されているかdeclare、組み込み-o functraceでオプションが有効になっている場合setを除き、DEBUG トラップと RETURN トラップは継承されません (この場合、すべての関数は DEBUG トラップと RETURN トラップを継承します)。また、シェル-o errtraceオプションが有効になっている場合を除き、ERR トラップは継承されません。

関連情報