Что означает set-e в скрипте bash?
Я изучаю содержание этого preinst файл, который скрипт выполняет перед распаковкой этого пакета из архива Debian (.файл deb).
скрипт имеет следующий код:
#!/bin/bash
set -e
# Automatically added by dh_installinit
if [ "" = install ]; then
if [ -d /usr/share/MyApplicationName ]; then
echo "MyApplicationName is just installed"
return 1
fi
rm -Rf $HOME/.config/nautilus-actions/nautilus-actions.conf
rm -Rf $HOME/.local/share/file-manager/actions/*
fi
# End automatically added section
мой первый запрос о строку:
set -e
Я думаю, что остальная часть скрипта довольно проста: он проверяет, выполняет ли менеджер пакетов Debian/Ubuntu операцию установки. Если это так, он проверяет, имеет ли мое приложение только что был установлен в системе. Если это так, скрипт печатает сообщение "MyApplicationName только что установлен" и заканчивается (return 1 означает, что заканчивается "ошибка", не так ли?).
если пользователь просит систему пакетов Debian/Ubuntu установить мой пакет, скрипт также удаляет два каталога.
это правильно или я что-то пропустила?
4 ответов:
С
help set:-e Exit immediately if a command exits with a non-zero status.но это считается плохой практикой некоторыми людьми (bash FAQ и такие, как люди, пишущие этот FAQ на irc freenode #bash), лучше использовать:
trap 'do_something' ERRдля выполнения
do_somethingфункция, когда ошибки будут происходить.
set -eостанавливает выполнение скрипта, если команда или конвейер имеют ошибку - что является противоположностью поведения оболочки по умолчанию, которое должно игнорировать ошибки в скриптах. Типаhelp setв терминале, чтобы увидеть документацию для этой встроенной команды.
по состоянию на Баш-набор встроенный руководство, если
-e/errexitустановлен, оболочка выходит немедленно, если a трубопровод состоят из одного простой командой,список или составная команда возвращает ненулевое состояние.по умолчанию состояние выхода конвейера является состоянием выхода последней команды в конвейере, если только
pipefailопция включена (она отключена неисполнение.)если это так, то конвейер возвращает статус последней (самой правой) команды для выхода с ненулевым статусом или нулем, если все команды завершаются успешно.
если вы хотите выполнить что-то на выходе, попробуйте определить
trap, например:trap onexit EXITздесь
onexitэто ваша функция, чтобы сделать что-то на выходе, как ниже, который печатает простой трассировка стека:onexit(){ while caller $((n++)); do :; done; }есть аналогичный вариант
-E/errtraceкоторый будет ловить на ERR вместо этого, например:trap onerr ERRпримеры
нулевое состояние пример:
$ true; echo $? 0ненулевой пример:
$ false; echo $? 1отрицание статуса примеры:
$ ! false; echo $? 0 $ false || true; echo $? 0
я нашел этот вопрос во время поиска в Интернете, пытаясь выяснить, какой статус выхода был для сценария, который был прерван из-за
set -e. Ответ не казался мне очевидным; отсюда и этот ответ. В принципе,set -eпрерывает выполнение команды (например, сценарий оболочки) и возвращает код состояния выхода команды, которая не удалась (т. е. внутренний сценарий, а не внешний сценарий).например, предположим, что у меня есть shell-скрипт
outer-test.sh:#!/bin/sh set -e ./inner-test.sh exit 62;код
inner-test.sh- это:#!/bin/sh exit 26;когда я запускаю
outer-script.shиз командной строки мой внешний скрипт завершается с кодом выхода на внутренний скрипт:$ ./outer-test.sh $ echo $? 26
Comments