Как вызвать ошибку с помощью команды 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

    Выборочно копировать из коллекции удаленных каталогов

    Как может команда монтирования сбой в одном окне терминала, но не в другом?

    использование случайных в tar для распаковки файлов

    Вставить переменную в строку в случайное место?

    В Gentoo как найти список пакетов, установленных после определенной даты?

    Сравнение массивных каталогов с отчетом о проделанной работе

    Команда Wget – как загрузить с определенного IP-адреса и порта

    Изменить привязку порта с 127.0.0.1 до 0.0.0.0 на Oracle Linux 6 (RHEL 6)

    Каков правильный способ ссылки на LINUX / UNIX в целом?

    Корреляция между CHROOT и Crouton – –

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

    Как включить и использовать сводку кода в Vim?

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

    Терминал не открывается в Linux после перезаписывания случайного разрешения

    Функция Shell, которая потребляет два аргумента за одну итерацию цикла

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