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