set
и shopt
оба встроенные оболочки, которые контролируют различные параметры. Я часто забываю, какие параметры устанавливаются с помощью какой команды, а какие устанавливаются / удаляются ( set -o/+o
, shopt -s/-u
). Почему есть две разные команды, которые, по-видимому, делают одно и то же (и имеют разные аргументы для этого)? Есть ли какой-нибудь простой способ / мнемоника запомнить, какие опции идут с какой командой?
72
help set
иhelp shopt
убедиться, что даже их авторы думают, что они делают то же самое.Ответы:
Насколько я знаю,
set -o
опции - это те, которые унаследованы от других оболочек в стиле Борна (в основном ksh), иshopt
опции, специфичные для bash. Там нет логики, о которой я знаю.источник
shopt
, передается по наследству?set -o
опции, какposix
/physical
/interactive-comments
, которых нет вksh
, иshopt
те, которые есть в других оболочках, в том числеksh
для некоторых вродеlogin_shell
/nullglob
. Как вы говорите, нет логики. Вероятно, с самого начала была идея (что SHELLOPTS будут стандартными, а BASHOPTS - специфичными для bash), но это было потеряно на этом пути, и теперь это просто приводит к раздражению и фиаско дизайна пользовательского интерфейса.Разница заключается в измененной переменной среды, используемой bash. Установка с помощью
set
команды приводит к$SHELLOPTS
. Установка с помощьюshopt
команды приводит к$BASHOPTS
.источник
shopt
с $ SH ELL OPT S, а не с $ BA SHOPT S.set
это POSIX 7: установить - установить или сбросить параметры и позиционные параметры | pubs.opengroup.orgshopt
не является: Shell & Utilities: подробная Toc | pubs.opengroup.orgВероятно, связано с историей, упомянутой @Gilles.
источник
Легко, но потеряно в истории
set
Команда первоначально была использована для изменения среды командной строки исходных Unix оболочек/bin/sh
. Затем, по мере развития различных версий Unix и добавления новых разновидностей оболочки, люди поняли, что им нужно иметь возможность изменять больше (среды) вещей, чтобы поддерживать совместимость сценариев оболочки. В то время Bash получил очень популярен и дополнительные ш ELL неавтоматические требовались ионы, введениеshopt
.Вы можете увидеть эти Compat попытки ibility в
shopt
команде.Но не в
set
команде.источник
set
поскольку способа установки параметров не было в исходных оболочках Unix, он был представлен оболочкой Bourne в конце 70-х годов.set -o name
позже сама была добавлена оболочкой Korn, определенной, но необязательной в POSIX, которая до сих пор не поддерживается "современными" версиями оболочки Bourne, такими как/bin/sh
Solaris 10.Из книги «Сценарии Linux Shell с Bash», стр. 63:
источник
Похоже, что «заданные» опции наследуются подоболочками, а шопты - нет.
источник
set
, не наследуются подоболочками. Обеset
иshopt
параметры не наследуются подоболочками.set
иshopt
?set -o
иshopt
параметры наследуются подоболочками ((...)
,$(...)
компонентами конвейера). Будь они унаследованы другимиbash
вызовами , зависит от того ,SHELLOPTS
илиBASHOPTS
находятся в окружающей среде или нет.set
происходит от оболочки bourne (sh) и является частью стандарта POSIX,shopt
однако не является специфичной для оболочки bourne (bash):источник