Что означает 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 функция при возникновении ошибок.

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


set -e останавливает выполнение скрипта, если команда или конвейер имеет ошибку, противоположную поведению оболочки по умолчанию, которая должна игнорировать ошибки в скриптах. Тип help set в терминале, чтобы увидеть документацию для этой встроенной команды.


по состоянию на bash-набор встроенный руководство, если -e/errexit установлен, оболочка выходит немедленно, если трубопровод состоят из одного простой командой, список или составная команда возвращает ненулевое состояние.

по умолчанию состояние выхода конвейера является состоянием выхода последней команды конвейера, если только 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

я нашел этот вопрос во время поиска в Google, пытаясь выяснить, какой статус выхода был для сценария, который был прерван из-за 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