シェル スクリプト内でエラーをトラップし、エラーの理由に関するレポートを生成したいと考えています。
trap 'error_handler' ERR
私のerror_handler
機能では、シグナルがキャッチされた理由を示したいと思いますERR
(たとえば、「許可が拒否されました」、「リモートホストが見つかりません」など)。
これは可能ですか?
シェル スクリプト内でエラーをトラップし、エラーの理由に関するレポートを生成したいと考えています。
trap 'error_handler' ERR
私のerror_handler
機能では、シグナルがキャッチされた理由を示したいと思いますERR
(たとえば、「許可が拒否されました」、「リモートホストが見つかりません」など)。
これは可能ですか?
あまり。エラー ハンドラで使用できることが保証されている唯一の情報は、.in をトリガーしたプロセスの終了ステータスERR
です$?
。プロセスの名前もそのプロセス ID もわかりません。エラーハンドラーは、スクリプトを終了する前の一般的な目的のクリーンアップを目的としていると思うので、どのプロセスがゼロ以外の終了ステータスを持っていたか、またはその理由は問題ではありません。
次のように、エラーが発生したときにすぐに報告するか、エラーに対処することをお勧めします。
rm foo || { echo "File removal failed"; }
ほとんどのコマンドは、独自の失敗通知を標準エラーに出力することに注意してください。
エラー トラップ ハンドラは、実行の原因となった正確なエラーに関する情報を受け取っていないと思います。失敗したコマンドから終了コードを取得できますが、トラップが実行されるまでには、どのコマンドが失敗したかさえわかりません。
単純な C プログラムを作成して、最新のシステム エラーを取得するperror
などを試みることができます。
... 更新: 動作しません。振り返ってみると、明らかな理由があります。このことは、次の世代が発見できるようにここに残しておきます。/-:
vnix$ cat perror.c
#include <stdio.h>
#include <errno.h>
int main (int argc, char **argv)
{
perror("");
}
vnix$ gcc perror.c
vnix$ touch /fnord
touch: cannot touch `/fnord': Permission denied
vnix$ ./a.out
Success