#linux #bash #shell
Вопрос:
set
позволяет настроить выполнение оболочки, включив некоторые функции. Некоторые из наиболее популярных:
set -e # exit on error
set -x # print executed commands
Есть ли способ в скрипте обнаружить включенные в данный момент функции?
В моем конкретном случае я хотел бы знать, был ли set -x
он вызван.
Ответ №1:
Используйте $-
переменную:
$ echo $-
himBCHs
$ set -e
$ set -x
$ echo $-
ehimxBCHs
^ ^
Так:
if [[ $- == *x* ]]; then
echo "xtrace is set"
fi
Комментарии:
1. Спасибо, что ответили на мой вопрос. У меня есть несколько вопросов. [1] Поскольку
$-
сбрасывает все параметры, включенные в оболочку, с использованием соответствующих букв, должна быть возможность восстановить все параметры, выполнив итерацию по сохраненной строке из$-
иeval
ingset
с каждым параметром, один за другим. Я прав? [2] Есть ли способ применить все параметры сразу, кроме описанного выше повторения?2. Вы могли бы это сделать
opts=$(do_stuff_with "$-"); set "-$opts"
, но некоторые параметры оболочки не могут быть заданыset
, например-i
. В петле:while IFS= read -r -n1 opt; do do_something_with "$opt"; done < <(printf '%s' "$-")
3. Или
opts="$-"; for ((i=0;i<${#opts};i )); do echo do_stuf_with "${opts:i:1}"; done
4. Вы можете быть удивлены, насколько медленнее это может быть: github.com/glennj/exercism.io/blob/main/_mentor_notes/…
Ответ №2:
Команда set -o
выводит все настроенные параметры bash.
Ответ №3:
Встроенный shopt
, вероятно, может показать то, что вы хотели.
В man bash
errexit Same as -e
Сейчас
help shopt
Выход
shopt: shopt [-pqsu] [-o] [optname ...]
Set and unset shell options.
Change the setting of each shell option OPTNAME. Without any option
arguments, list each supplied OPTNAME, or all shell options if no
OPTNAMEs are given, with an indication of whether or not each is set.
Options:
-o restrict OPTNAMEs to those defined for use with `set -o'
-p print each shell option with an indication of its status
-q suppress output
-s enable (set) each OPTNAME
-u disable (unset) each OPTNAME
Exit Status:
Returns success if OPTNAME is enabled; fails if an invalid option is
given or OPTNAME is disabled.
shopt -qo errexit
echo $?
Он возвращается 1
, если он отключен или 0
включен.
Теперь нужно провести настоящий тест.
if shopt -qo errexit; then
printf 'errexit is enabled!n'
fi
Или, если вы хотите отрицать, используйте взрыв !
if ! shopt -qo errexit; then
printf 'errexit is disabled!n'
fi