Как я могу перечислить опции bash'а для текущей оболочки?

27

У самого интерпретатора bash есть опции, т.е.

Строки 22-23 страницы руководства bash:

OPTIONS  
All of the  single-character shell options documented in the description of the set builtin command can be used as options when the shell is invoked.   In addition, bash interprets the following options when it is invoked:  
-c ...  
-i ...  
-l ...  
-r ...  

Я использовал несколько шаблонов поиска в справочной странице bash:

  • /^\s*set
  • /list

Можно ли распечатать список этих настроек, которые применяются к текущей оболочке?

the_velour_fog
источник

Ответы:

26
printf %s\\n "$-"

Перечислите варианты одной буквы в одной строке.

Этот параметр также может быть использован как:

set -f -- ${-:+"-$-"}
echo *don\'t* *glob* *this*
set +f "$@"

Сначала отключить -fрасширение оболочки ilename, одновременно сохраняя значение $-- если оно есть - в $1. Далее, глобусы не возникают, и последнее +fрасширение ilename снова включается и, возможно, также отключается.

Например, если -fрасширение ilename уже было отключено при $-первом сохранении значения для , то его сохраненное значение будет (как минимум) :

f

И поэтому, когда setзапускается снова, это работает для:

set +f -f

Что просто возвращает вас туда, откуда вы начали.

set +o

Перечислим все setварианты таблицы оболочки (см ответа Джейсона за shoptвозможность - это то , что слово - варианты) в форме , которая является безопасной для спускаемога оболочки. Таким образом, вы также можете сделать:

state=$(set +o)
set -some -crazy -options
eval "$state"

Для сохранения, изменения и восстановления состояния параметров оболочки соответственно.

Чтобы обработать shoptионы и setпараметры таблицы за один раз:

state=$(set +o;shopt)
#do what you want with options here
eval "$state"

Вы также можете позвонить set без каких-либо аргументов, чтобы добавить список всех установленных на данный момент переменных оболочки - также указанных для повторного входа в оболочку. И вы можете - в bash - дополнительно добавить команду, typeset -fpчтобы также включить все объявленные в настоящее время функции оболочки. Вы можете смешать все это вместе и evalкогда будете готовы. Вы можете даже позвонить aliasбез аргументов для более того же. Это ... может покрыть это, хотя. Я предполагаю, что есть "$@"- что вы должны были бы поместить в bashмассив сначала, я полагаю, перед тем, как делать set.

Нет, есть также trap. Это немного смешно. Обычно:

trap 'echo this is my trap' 0
(echo this is my subshell; trap)

... просто напечатает это - моя подполочка, потому что подоболочка - это новый процесс, который получает свой собственный набор traps - и поэтому не наследует никаких traps, кроме тех, которые его родительский элемент явно проигнорировал - (например trap '' INT) .

Тем не мение:

trap 'echo this is my trap' 0
save_traps=$(trap)

trapведет себя особенно, когда это первая и единственная команда, запускаемая в подоболочке подстановки команд, поскольку она воспроизводит список установленных trapsв данный момент родительских оболочек в формате, указанном для безопасного повторного входа в оболочку. И так что вы можете сделать save_traps, то set без аргументов - и все остальное уже было сказано - в значительной степени получить блокировку на все состояния оболочки. Возможно, вы захотите явно добавить export -pи readonly -pвосстановить оригинальные атрибуты оболочки var.

Во всяком случае, этого достаточно.

mikeserv
источник
спасибо, ваш код работает хорошо Таким образом, чтобы получить полный список всех опций, вам придется использовать оба set +o и shopt ? (что касается shoptтого, чтобы быть словом, settableиспользуется на странице руководства, так что shoptableработает для меня)
the_velour_fog
@ user4668401 - Я думаю, что это сделает.
mikeserv
TL; DR, но +1000 для решения с 3 строками, чтобы изменить опцию и вернуть ее «как было». Это именно то, что нужно при создании сценариев или копировании / вставке инструкций.
Balmipour
@mikeserv Кажется, что опция -p должна быть добавлена ​​при сохранении состояния, чтобы включить shoptионы, то естьstate=$(set +o;shopt -p)
nkatsar
9

Со manстраницы:

shopt
... Без параметров или с параметром -p отображается список всех настраиваемых параметров с указанием того, установлены они или нет.
shopt | grep on

распечатает список всех включенных опций.

jasonwryan
источник
это сработало, спасибо. Знаете ли вы, если в этом списке перечислены параметры, которые могут быть установлены как setи shopt?
the_velour_fog
@ user4668401 Нет, setгораздо более обширный: см. запись справочной страницы .
Джейсонвриан
И проверить, включен ли один из вариантов:shopt <option>
Кос
это будет включать опции с 'on' в имени (то есть huponexit). простой способ исправить этоshopt | grep on$
Майк Д
6

Чтобы перечислить все варианты:

set -o

Чтобы проверить конкретный вариант:

set -o | grep <OPTION>

Возьмите вариант verboseв качестве примера:

$ set -o | grep verbose
verbose         off
Джереми Као
источник
6

Опции ?: В bash есть три группы опций.

  1. Опции читаются или устанавливаются командой set.
    (Используйте эту команду для ручной: LESS=+/'set \[--abefhkmnptuvxBCEHPT\]' man bash)
    Все варианты одной буквы:abefhkmnptuvxBCEHPT

    Также параметры (которые не имеют одинарного буквенного эквивалента):

    set -o emacs
    set -o history
    set -o ignoreeof
    set -o interactive-comments
    set -o pipefail
    set -o posix
    set -o vi
  2. Опции читаются или устанавливаются командой shopt.
    (Прочитать руководство этой команды: LESS=+/'shopt \[-pqsu\]' man bash')
    Список довольно длинный , но легко печатать, использование:

    $ shopt -p

    или аналогичный (но не равный):

    $ shopt
  3. Параметры , которые могут быть установлены на призывание:
    (команда для ручной: LESS=+/'^INVOCATION' man bash)

    Все setварианты:

    bash -abefhkmnptuvxBCEHPT

    Все shoptварианты

    bash -O option

    Некоторые опции, которые имеют смысл только при вызове bash:

    bash -lirsDc

    А также (длинные варианты):

    bash --debugger --help --init-file file --rcfile file --login \
         --noediting --noprofile --norc --posix --restricted \
         --verbose --version

Все setварианты одной буквы и -riнапечатаны с $-.

-i      Interactive  
Only read with `$-` (if it contains an `i`).
-r      Restricted
Also read with `shopt -p restricted_shell

Например:

$ echo 'echo $0 $-' | bash -abefhikmprtuvxBCEHPT -lri

О вызове bash в качестве оболочки входа сообщается только с shopt:

-l      Login
read with `shopt -p login_shell`

Таким образом:

$ echo 'shopt -p login_shell' | bash -abefhikmprtuvxBCEHPT -lri
shopt -s login_shell

Опция -nне может быть протестирована каким-либо кодом, так как это означает: не выполнять никакого кода.


Варианты печати

Лучший инструмент для перечисления параметров запущенной оболочки, либо те, которые установлены с помощью, setлибо те, которые установлены с shoptпомощью, одинаковы shopt. Чтобы вывести список установленных параметров:

shopt -o

Который действует именно так set -o. Используйте, shopt -poчтобы получить тот же результат, что и set +o.

Для просмотра списка покупок:

shopt -p

Из которых вы можете распечатать либо те, которые установлены shopt -psили не установленыshopt -pu

Чтобы получить все варианты. Столько, сколько это возможно, столько длинных опций и некоторые ( -sDc) на INVOCATION не могут быть напечатаны:

$ echo $-; shopt -p ; shopt -po

Чтобы сохранить их в переменной:

$ storeoptions="$(echo "set -$-"; shopt -p ; shopt -po)"

И переменная может быть использована для установки всех параметров:

$ eval "$storeoptions"

источник
1

Чтобы проверить конкретный вариант:

if shopt -q <OPTION>
then echo '<OPTION> is set'
fi
Брюс
источник