Как вызвать ошибку с помощью команды Trap

Я использую Ubuntu 12.04.2. Я пытаюсь использовать команду «trap» для захвата аномалии или ошибки в моем сценарии оболочки, но я также пытаюсь вручную вызвать «Ошибка».

Я пробовал выход 1, но он не будет вызывать сигнал «Ошибка».

#!/bin/bash func() { exit 1 } trap "echo hi" INT TERM ERR func 

Не знаете, как вручную запускать сигнал выхода «Ошибка»?

  • Ошибки и местные
  • Линейный выход литиевого выхода
  • Как проверить, завершена ли команда, такая как завиток, без ошибок?
  • Почему «синтаксическая ошибка около неожиданного токена»?
  • open () вернуть новый дескриптор файла posix
  • Остановить выполнение, когда что-то написано в stderr
  • Ошибка: «TCP_NODELAY» не был объявлен в этой области
  • TCL скрипт try catch
  • 2 Solutions collect form web for “Как вызвать ошибку с помощью команды Trap”

    ERR ловушка не запускает код, когда сама оболочка выходит с ненулевым кодом ошибки, но когда любая команда выполняется этой оболочкой, которая не является частью условия (например, в if cmd... или cmd || ... …) выходит с ненулевым статусом выхода (те же условия, что и причины set -e для выхода из оболочки).

    Если вы хотите запустить код при выходе из оболочки с ненулевым статусом выхода, вы должны добавить ловушку вместо EXIT и проверить $? там:

     trap '[ "$?" -eq 0 ] || echo hi' EXIT 

    Обратите внимание, однако, что при захваченном сигнале будут запущены как ловушка сигнала, так и ловушка EXIT, поэтому вы можете сделать это так:

     unset killed_by trap 'killed_by=INT;exit' INT trap 'killed_by=TERM;exit' TERM trap ' ret=$? if [ -n "$killed_by" ]; then echo >&2 "Ouch! Killed by $killed_by" exit 1 elif [ "$ret" -ne 0 ]; then echo >&2 "Died with error code $ret" fi' EXIT 

    Или использовать статус выхода, например $((signum + 128)) по сигналам:

     for sig in INT TERM HUP; do trap "exit $((128 + $(kill -l "$sig")))" "$sig" done trap ' ret=$? [ "$ret" -eq 0 ] || echo >&2 "Bye: $ret"' EXIT 

    Обратите внимание, однако, что выход из строя на SIGINT или SIGQUIT имеет потенциальные раздражающие побочные эффекты, когда ваш родительский процесс представляет собой оболочку, такую ​​как bash которая реализует процедуру ожидания ожидания и совместной обработки терминального прерывания. Таким образом, вы можете захотеть убить себя одним и тем же сигналом, чтобы сообщить своему родителю, что вы действительно прерваны, и что он должен также рассмотреть возможность выхода из него, если он получил SIGINT / SIGQUIT.

     unset killed_by for sig in INT QUIT TERM HUP; do trap "exit $((128 + $(kill -l "$sig"))); killed_by=$sig" "$sig" done trap ' ret=$? [ "$ret" -eq 0 ] || echo >&2 "Bye: $ret" if [ -n "$killed_by" ]; then trap - "$killed_by" # reset handler # ulimit -c 0 # possibly disable core dumps kill -s "$killed_by" "$$" else exec "$ret" fi' EXIT 

    Если вы хотите запустить ERR ловушку, просто запустите команду с ненулевым статусом выхода, например, false или test .

    Используйте return, а не exit, чтобы установить статус при выходе из функции (если функция проваливается без возврата, статус соответствует статусу последнего выполняемого оператора.) Если вы замените return для exit в примере вопроса, это будет как я думаю, вы намеревались: ловушка будет запущена на псевдосигнале ERR, и «hi» будет напечатана. Для дополнительных соображений попробуйте следующее:

     #!/bin/bash func() { echo 'in func' return 99 echo 'still in func' } trap 'echo "done"' EXIT trap 'status=$?; echo "error status is $status"; trap - EXIT; exit $status' ERR func echo 'returned from func' 

    Вы можете попробовать различные модификации, такие как возврат 0, комментирование ловушки ERR, а не отмена ловушки EXIT в обработчике ERR, а не выход из обработчика ERR или удаление возвращаемого значения, а false как последнее выражение в func.

    Linux и Unix - лучшая ОС в мире.