"Bash" не поддерживает команду "try/catch". Однако существуют другие способы применения ее функциональности, например, операторы "if/else", "OR", команда "trap" или флаг "-x".
Термин "try-catch" используется в программировании для обработки исключений. Проще говоря, блок "try" пытается выполнить некоторую работу, и если возникает ошибка, например, файл не найден, он выбрасывает исключение, которое может быть скопировано в блок "catch".
В данном руководстве рассматриваются подходы, которые могут быть использованы вместо команды "try/catch".
Проверьте "Статус выхода"
Все команды генерируют однозначное значение ("0" для "true" и "1" для "false"). Это делается с помощью опции "set -e". Эта опция побуждает Bash к немедленному выходу, если какая-либо команда в скрипте завершается с ненулевым кодом. В приведенном ниже примере скрипт устанавливает Firefox на систему. После успешного выполнения он выводит сообщение "Command Succeeded", как показано ниже:
1 2 3 4 | #!/bin/bash set -e sudo apt install firefox echo "Command succeeded" |
Перед выполнением скрипта обязательно дайте ему права на выполнение (приведенный выше скрипт имеет имя "script.sh") с помощью команды chmod с флагом +x:
1 | sudo chmod +x script.sh |
Приведенная выше команда подтверждает, что права на выполнение были предоставлены файлу "script.sh". Однако для его выполнения выполните следующую команду:
1 | bash script.sh |
Из приведенного выше изображения видно, что команда успешно выполнена, поскольку отображается сообщение "command succeeded". Существует множество сценариев, в которых можно использовать команду echo для проверки "статуса выхода" сразу после выполнения команды.
Как заставить команду "trap" работать как TRY CATCH?
Команда "trap" работает на основе сигналов, посылаемых ей ОС или пользователем (нажатие клавиш "CTRL+C" для прерывания работы программы). Это триггер, который является реакцией на определенную команду. Например, приведенный ниже скрипт работает до тех пор, пока пользователь не нажмет "CTRL+C". После нажатия он выдаст сообщение "ловушка сработала" и будет спать в течение "5" секунд, после чего вернет управление пользователю:
1 2 3 4 5 6 7 8 | #!/bin/bash trap 'echo "trap worked"' INT ( trap '' INT sleep 5 echo "done" ) & wait |
Приведенный выше сценарий имеет имя "script.sh". Выполним его для просмотра результатов:
1 | bash script.sh |
В приведенном выше терминале видно, что при нажатии клавиш "CTRL+C" выводится сообщение "ловушка сработала", а сценариев использования этого сценария может быть множество. Например, в приведенном ниже сценарии, когда служба запущена, он остановит и перезапустит эту службу. Предположим, что в данном случае в качестве службы выступает "mysql":
1 2 3 4 5 6 7 8 9 10 | #!/bin/bash function finish { echo "service started" sudo service mysql start } trap finish EXIT echo "service stopped" sudo service mysql stop |
Сценарий имеет имя "script.sh". Давайте выполним его, чтобы посмотреть результат:
1 | bash script.sh |
Как видно из приведенного выше терминала, он сначала останавливает службу, а затем запускает ее снова. Если вы хотите запустить службу сразу после ее остановки, нажмите клавиши "CTRL+C":
1 | bash script.sh |
Приведенные примеры похожи на "try/catch" тем, что сценарий с несколькими командами выполняется очень долго. Его можно устранить с помощью сочетаний клавиш "CTRL+Z", но при этом не будет выведено сообщение, напечатанное командой "echo". Зато при использовании команды "trap" легче определить, какая команда работает нормально, а какая нет.
Как отследить вывод с помощью флага "-x" в Bash?
Флаг "-x" используется для отладки сценария bash. Он интерпретирует каждую выполняемую строку и отображает все, что есть в скрипте. Чтобы воспользоваться им, добавьте при выполнении команды предшествующее "-x", как показано ниже:
1 | bash -x script.sh |
В результате параметры скрипта будут отображаться в том же формате, в котором он выполняется.
Как принудительно завершить работу при обнаружении ошибки в Bash?
Для выхода из системы в bash используется "set" в сочетании с "errexit" или "-e". Это означает автоматическое завершение команды при возникновении ошибки. Эта опция предписывает "Bash" немедленно завершать сценарий, когда любая команда возвращает ненулевой статус выхода, указывающий на ошибку.
Ниже приведен пример сценария, в котором обновляются системные репозитории, устанавливается Python, клонируется git, устанавливаются требования для Python и, наконец, запускается сервер:
1 2 3 4 5 6 7 | #!/bin/bash set -e sudo apt-get update sudo apt install git curl python3-pip git clone https://github.com/example/repo.git pip3 install -r requirements.txt python3 app.py |
Он имеет имя "script.sh". Для его выполнения выполните приведенную ниже команду, как описано ниже:
1 | bash script.sh |
Указанные выше "Имя пользователя" и "Пароль" для GitHub являются неверными, что приведет к ошибке, в результате которой скрипт будет завершен, как показано ниже:
Как видно из приведенного выше, скрипт немедленно завершается после появления ошибки.
Заключение
Сценарии bash не поддерживают операторы "try/catch", как большинство других языков кодирования. Тем не менее, существуют другие альтернативы для применения той же функциональности, такие как проверка "статуса выхода", применение команды "trap" или трассировка вывода с помощью флага "-x", которые также могут быть полезны. Кроме того, скрипт может быть немедленно завершен при возникновении ошибки с помощью команды "set -e". В данном руководстве было рассмотрено состояние команды "try/catch" в bash и ее альтернативы.