Задать и снять - почему два?

72

setи shoptоба встроенные оболочки, которые контролируют различные параметры. Я часто забываю, какие параметры устанавливаются с помощью какой команды, а какие устанавливаются / удаляются ( set -o/+o, shopt -s/-u). Почему есть две разные команды, которые, по-видимому, делают одно и то же (и имеют разные аргументы для этого)? Есть ли какой-нибудь простой способ / мнемоника запомнить, какие опции идут с какой командой?

Kevin
источник
6
Попробуйте посмотреть на вторую строку help setи help shoptубедиться, что даже их авторы думают, что они делают то же самое.
10
2
«Изменить значение атрибутов оболочки» и «Изменить настройку каждого параметра оболочки».
Кевин
2
В выпуске Bash 4.1.5 (1) написано «Установить или сбросить значения параметров оболочки и позиционных параметров». и «Установить и сбросить параметры оболочки.», соответственно.
10
Написание man-страниц заставляет вас осознать, что вы не знаете, и заставляет вас пытаться формулировать вещи так, чтобы вы не ошиблись в том, о чем вы пытаетесь писать.
Sjas

Ответы:

40

Насколько я знаю, set -oопции - это те, которые унаследованы от других оболочек в стиле Борна (в основном ksh), и shoptопции, специфичные для bash. Там нет логики, о которой я знаю.

Жиль "ТАК - перестань быть злым"
источник
1
Любая документация, которая показывает shopt, передается по наследству?
Фелипе Альварес
8
Ну, есть такие set -oопции, как posix/ physical/ interactive-comments, которых нет в ksh, и shoptте, которые есть в других оболочках, в том числе kshдля некоторых вроде login_shell/ nullglob. Как вы говорите, нет логики. Вероятно, с самого начала была идея (что SHELLOPTS будут стандартными, а BASHOPTS - специфичными для bash), но это было потеряно на этом пути, и теперь это просто приводит к раздражению и фиаско дизайна пользовательского интерфейса.
Стефан Шазелас
22

Разница заключается в измененной переменной среды, используемой bash. Установка с помощью setкоманды приводит к $SHELLOPTS. Установка с помощью shoptкоманды приводит к $BASHOPTS.

mug896
источник
9
Тьфу! Это еще более запутанно. Мой мозг хочет ассоциироваться shoptс $ SH ELL OPT S, а не с $ BA SHOPT S.
Бруно Броноски
8

Легко, но потеряно в истории setКоманда первоначально была использована для изменения среды командной строки исходных Unix оболочек /bin/sh. Затем, по мере развития различных версий Unix и добавления новых разновидностей оболочки, люди поняли, что им нужно иметь возможность изменять больше (среды) вещей, чтобы поддерживать совместимость сценариев оболочки. В то время Bash получил очень популярен и дополнительные ш ELL неавтоматические требовались ионы, введение shopt.

Вы можете увидеть эти Compat попытки ibility в shoptкоманде.

$ shopt
autocd          off
cdable_vars     off
cdspell         off
checkhash       off
checkjobs       off
checkwinsize    off
cmdhist         on
compat31        off
compat32        off
compat40        off
compat41        off
compat42        off
complete_fullquote      on
direxpand       off
dirspell        off
dotglob         off
execfail        off
expand_aliases  on
extdebug        off
extglob         off
extquote        on
failglob        off
force_fignore   on
globstar        off
globasciiranges off
gnu_errfmt      off
histappend      on
histreedit      off
histverify      off
hostcomplete    on
huponexit       off
interactive_comments    on
lastpipe        off
lithist         off
login_shell     on
mailwarn        off
no_empty_cmd_completion off
nocaseglob      on
nocasematch     off
nullglob        off
progcomp        on
promptvars      on
restricted_shell        off
shift_verbose   off
sourcepath      on
xpg_echo        off

Но не в setкоманде.

$ set -o
allexport       off
braceexpand     on
emacs           on
errexit         off
errtrace        off
functrace       off
hashall         on
histexpand      on
history         on
igncr           off
ignoreeof       off
interactive-comments    on
keyword         off
monitor         on
noclobber       off
noexec          off
noglob          off
nolog           off
notify          off
nounset         off
onecmd          off
physical        off
pipefail        off
posix           off
privileged      off
verbose         off
vi              off
xtrace          off
emigenix
источник
2
setпоскольку способа установки параметров не было в исходных оболочках Unix, он был представлен оболочкой Bourne в конце 70-х годов. set -o nameпозже сама была добавлена ​​оболочкой Korn, определенной, но необязательной в POSIX, которая до сих пор не поддерживается "современными" версиями оболочки Bourne, такими как /bin/shSolaris 10.
Стефан Шазелас
5

Из книги «Сценарии Linux Shell с Bash», стр. 63:

Исторически setкоманда использовалась для включения и выключения опций. По мере того, как количество опций росло, его использование setстановилось все труднее, потому что опции представлены однобуквенными кодами. В результате Bash предоставляет команду shopt( shell option ) для включения и выключения опций по имени вместо буквы. Вы можете установить определенные параметры только по буквам. Другие доступны только под shoptкомандой. Это делает поиск и настройку определенного параметра запутанной задачей.

LoMaPh
источник
3

Похоже, что «заданные» опции наследуются подоболочками, а шопты - нет.

user29778
источник
Хорошо поймал. Интересно, это намеренный выбор или побочный эффект?
Кевин
2
@ user29778 По крайней мере в bash 4.1.5 (1) параметры, установленные с set, не наследуются подоболочками. Обе setи shoptпараметры не наследуются подоболочками.
Мартин
Можете ли вы указать на документацию, которая описывает характеристики наследования обоих setи shopt?
Фелипе Альварес
9
Оба параметра set -oи shoptпараметры наследуются подоболочками ( (...), $(...)компонентами конвейера). Будь они унаследованы другими bashвызовами , зависит от того , SHELLOPTSили BASHOPTSнаходятся в окружающей среде или нет.
Стефан Шазелас
0

setпроисходит от оболочки bourne (sh) и является частью стандарта POSIX, shoptоднако не является специфичной для оболочки bourne (bash):

0 sjas@ssg 14:31:45 ~  
set | grep -e SHELLOPTS -e BASHOPTS
BASHOPTS=checkwinsize:cmdhist:complete_fullquote:dotglob:expand_aliases:extglob:extquote:force_fignore:histappend:interactive_comments:progcomp:promptvars:sourcepath
SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor

0 sjas@ssg 14:31:51 ~  
shopt | column -t | grep -v off
checkwinsize             on
cmdhist                  on
complete_fullquote       on
dotglob                  on
expand_aliases           on
extglob                  on
extquote                 on
force_fignore            on
histappend               on
interactive_comments     on
progcomp                 on
promptvars               on
sourcepath               on

0 sjas@ssg 14:31:57 ~  
set -o | column -t | grep -v off
braceexpand           on
emacs                 on
hashall               on
histexpand            on
history               on
interactive-comments  on
monitor               on

0 sjas@ssg 14:37:41 ~ 
sh 

$ set -o
Current option settings
errexit         off
noglob          off
ignoreeof       off
interactive     on
monitor         on
noexec          off
stdin           on
xtrace          off
verbose         off
vi              off
emacs           off
noclobber       off
allexport       off
notify          off
nounset         off
priv            off
nolog           off
debug           off

$ shopt
sh: 3: shopt: not found

$ 
sjas
источник