Как определить включенные параметры оболочки

#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 ing set с каждым параметром, один за другим. Я прав? [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