Что означает 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 установить мой пакет, скрипт также удаляет два каталога.



это правильно или я что-то пропустила?

849   4  

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 функция, когда ошибки будут происходить.

см.http://mywiki.wooledge.org/BashFAQ/105

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

    Ничего не найдено.