Введение
Мы можем использовать команду trap
для перехвата сигналов системной ошибки от системы во время работы скрипта. Затем вы можете запустить команду оболочки или вызвать функцию. Таким образом, вы можете запустить свой собственный код сценария при ошибке, возникшей в сценарии bash.
Это может быть полезно для отмены любых частичных изменений, закрытия соединений с базой данных или статуса электронной почты для затронутых людей и т. д. Вы можете использовать команду trap с сигналом ERR как:
trap 'on_error_function' ERR
Когда в сценарии оболочки выдается ошибка, она выполняет функцию с именем ' on_error_function
' сценария оболочки. Вместо вызова функции вы также можете просто выполнить команду.
Пример: как выполнить функцию при ошибке в Bash
Давайте разберемся на примере. Создайте пример сценария оболочки и создайте функцию с любым именем. Затем добавьте команду trap
с функцией для сигнала ERR. Затем добавьте простую команду, которая выдает ошибку:
#!/usr/bin/env bash
on_error(){
echo "Some error occurred"
}
trap 'on_error' ERR
ls ~/dir_not_exists
Запустите скрипт выше, и вы должны увидеть результаты ниже:
ls: cannot access '/home/noviello/dir_not_exists': No such file or directory
Some error occurred
Вы можете видеть, что ошибка перехватывается и функция on_error()
выполняется bash-скриптом.
Пример: как выполнить команду при ошибке в Bash
Давайте посмотрим на другой пример. Здесь мы будем запускать команду при возникновении ошибки в сценарии оболочки:
#!/usr/bin/env bash
trap 'echo Ohhh no!' ERR
ls ~/dir_not_exists
В приведенном выше скрипте мы не определяем никаких отдельных функций. Просто запустите команду echo в случае ошибки. Запустите скрипт выше и посмотрите на результаты:
ls: cannot access '/home/noviello/dir_not_exists': No such file or directory
Ohhh no!
Пример: Как получить номер строки возникшей ошибки
Вы также можете узнать номер строки, где произошла ошибка в скрипте bash вместе с именем скрипта. Для этого используйте встроенную в bash «звонилку»:
#!/usr/bin/env bash
on_error(){
echo "Error found in: $(caller)" >&2
}
trap 'on_error' ERR
ls ~/dir_not_exists
Запустите скрипт выше и посмотрите на результаты. Вы увидите название скрипта и номер строки, где произошла ошибка.
ls: cannot access '/home/noviello/dir_not_exists': No such file or directory
Error found in: 9./script.sh
Вывод
Спасибо, что прочитали эту статью. Надеемся, что это руководство поможет вам лучше писать сценарии оболочки, обнаружив ошибку и предприняв некоторые действия.
Кроме того, помните, что ловушка ERR обнаруживает только ошибки времени выполнения. Как будто любая команда вернула ненулевой код состояния. Он не обнаруживает синтаксические ошибки, потому что в случае синтаксической ошибки сценарий завершается сбоем без выполнения каких-либо команд.