Введение
Часто при написании сценариев Bash вам необходимо завершить сценарий при выполнении определенного условия или выполнить действие на основе кода выхода команды.
В этой статье мы рассмотрим встроенную в Bash команду exit
и состояния выхода выполняемых команд.
Выход из состояния
Каждая команда оболочки возвращает код выхода при успешном или неудачном выходе.
По соглашению нулевой код выхода указывает на успешное выполнение команды, а ненулевое значение указывает на то, что произошла ошибка.
Специальная переменная $?
возвращает статус выхода последней выполненной команды:
date &> /dev/null
echo $?
Команда date
выполнена успешно, и код выхода равен нулю:
0
Если вы попытаетесь запустить ls
в несуществующем каталоге, код выхода будет ненулевым:
ls /nonexisting_dir &> /dev/null
echo $?
2
Код состояния можно использовать, чтобы узнать, почему команда не удалась. Страница руководства для каждой команды содержит информацию о кодах выхода.
При запуске многокомандного конвейера состояние выхода конвейера такое же, как у последней команды:
sudo tcpdump -n -l | tee file.out
echo $?
В приведенном выше примере echo $?
напечатать код выхода команды tee
.
Команда выхода в Bash
Команда exit
выходит из оболочки с состоянием N
Он имеет следующий синтаксис:
exit N
Если N
не указано, код состояния выхода соответствует коду последней выполненной команды.
При использовании в сценариях оболочки значение, переданное в качестве аргумента команде exit
, возвращается в оболочку как код выхода.
Примеры
Статус выхода команд можно использовать в условных командах, таких как if
. В следующем примере grep
завершится с нулем (что означает true в сценариях оболочки), если «строка поиска» будет найдена в filename
:
if grep -q "search-string" filename then
echo "String found."
else
echo "String not found."
fi
При выполнении списка команд, разделенных &&
(И) или ||
(ИЛИ), статус выхода команды определяет, будет ли выполнена следующая команда в списке. Здесь команда mkdir
будет выполняться только в том случае, если cd
возвращает ноль:
cd /opt/code && mkdir project
Если сценарий завершается exit
без указания параметра, код выхода сценария совпадает с кодом выхода последней команды, выполненной в сценарии.
Является ли использование только exit
таким же, как exit $?
.
Вот пример, показывающий, как завершить скрипт, если он вызывается пользователем без полномочий root:
#!/bin/bash
if [[ "$(whoami)"!= root ]]; then
echo "Only user root can run this script."
exit 1
fi
echo "doing stuff..."
exit 0
Если вы запустите скрипт от имени пользователя root, код выхода будет нулевым. В противном случае скрипт завершится с состоянием 1
.
Вывод
Каждая команда оболочки возвращает код выхода после завершения. Команда exit
используется для выхода из оболочки с определенным состоянием.