2012-08-24 5 views
4

Я хочу, чтобы поймать ошибку внутри сценария оболочки, а затем сгенерировать отчет по причине ошибки:Bash: Как уловить причину ошибки?

trap 'error_handler' ERR 

В моей error_handler функции, я хочу, чтобы дать причину, почему был пойман ERR сигнал (например, «разрешение отклонено», «не удается найти удаленный хост» и т. д.).

Возможно ли это?

ответ

3

Не совсем. Единственная часть информации, которую вы гарантированно получаете в обработчике ошибок, - это статус выхода процесса, который вызвал ERR, в $?. Вы даже не знаете имя процесса или его идентификатор процесса. Я считаю, что обработчик ошибок предназначен для очистки общего назначения перед выходом из сценария, поэтому не имеет значения, какой процесс имел ненулевой статус выхода или почему.

Вы лучше отчетность или работы с ошибками сразу же, когда они происходят, например, так:

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

Обратите внимание, что большинство команд будут печатать свои собственные уведомления Неэффективных стандартную ошибки.

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 
Смежные вопросы