bash 4.xで以下がある場合:
err_handler() {
echo You received error $1|mail -s "script error" MAILTO
}
trap err_handler ERR
トラップを呼び出すときに実際のstderr出力を関数に送信するにはどうすればよいですか?私はstderrをリダイレクトするためにすべての行にロジックを入れることを避けたいと思います。これが罠の要点だと思います。
答え1
コマンドがゼロ以外の終了状態に戻ると、出力はすでに完了しているため、エラー出力を遡ってキャプチャできません。ただし、次のコマンドを実行すると、スクリプトのすべてのstderr出力を最初からファイルにリダイレクトできます。
exec 2>/some/file
スクリプトの始めに。このコマンドのない形式は、exec
現在のシェルプロセスにリダイレクトを適用します。その後、エラーが発生した場合はファイルを送信できます。
この方法のもう1つの利点は、何らかの理由でメール転送が失敗した場合でも、ローカルでファイルを見続けることができることです(もちろん、原因がディスク障害の場合を除く)。