4

シェル スクリプト内でエラーをトラップし、エラーの理由に関するレポートを生成したいと考えています。

trap 'error_handler' ERR

私のerror_handler機能では、シグナルがキャッチされた理由を示したいと思いますERR(たとえば、「許可が拒否されました」、「リモートホストが見つかりません」など)。

これは可能ですか?

4

2 に答える 2

3

あまり。エラー ハンドラで使用できることが保証されている唯一の情報は、.in をトリガーしたプロセスの終了ステータスERRです$?。プロセスの名前もそのプロセス ID もわかりません。エラーハンドラーは、スクリプトを終了する前の一般的な目的のクリーンアップを目的としていると思うので、どのプロセスがゼロ以外の終了ステータスを持っていたか、またはその理由は問題ではありません。

次のように、エラーが発生したときにすぐに報告するか、エラーに対処することをお勧めします。

rm foo || { echo "File removal failed"; }

ほとんどのコマンドは、独自の失敗通知を標準エラーに出力することに注意してください。

于 2012-08-24T03:58:09.913 に答える
1

エラー トラップ ハンドラは、実行の原因となった正確なエラーに関する情報を受け取っていないと思います。失敗したコマンドから終了コードを取得できますが、トラップが実行されるまでには、どのコマンドが失敗したかさえわかりません。

単純な 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
于 2012-08-24T04:13:34.140 に答える