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

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

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

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

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

  • Линейный выход литиевого выхода
  • Ошибки и местные
  • Правильное использование ловушек EXIT & ERR в сценариях bash
  • open () вернуть новый дескриптор файла posix
  • Почему «синтаксическая ошибка около неожиданного токена»?
  • TCL скрипт try catch
  • Остановить выполнение, когда что-то написано в stderr
  • Как проверить, завершена ли команда, такая как завиток, без ошибок?
  • 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.

    Interesting Posts

    где я могу найти MIT-MAGIC-COOKIE в пользовательской части?

    Поведение памяти mmap'd на давление памяти

    OOM от итерации по очень большой карте памяти

    Почему оператор Grave меняет формат вывода команды?

    bash: невозможно установить переменную в сплошную строку

    Устройство с USB-портом для хранения пользователей – как определить / как разрешить небезопасные отключения?

    как мне управлять зависимостями для этого вручную установленного файла rpm?

    Отфильтровать запрос HTTP GET в wirehark?

    Простой bash не работает должным образом cron

    копирование файлов в другое место

    Извлеките (не размонтируйте) USB-устройства через терминал (SSH) и повторно установите USB-устройство после извлечения

    tmux-сервер игнорирует конфигурационный файл sourcing

    В u-boot, почему spi-вспышка проверена дважды?

    Как установить пакет объявлений в Kubuntu для LaTeX?

    Как использовать определенную функцию с xargs

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