Какие параметры оболочки bash используются анализатором?

Какие параметры оболочки bash используются анализатором?

Ограничивая наше внимание исключительно bash, ​​вэтот ответна Stack Overflow сообщается следующее.

extglobфлаг используетсяпарсером. Функции, составные команды и т. д. анализируются полностью перед выполнением. Таким образом, extglobнеобходимо задать до того, как будет проанализировано содержимое; установка его во время выполнения, но после времени анализа не оказывает никакого влияния на ранее проанализированное содержимое.

Вот почему нельзя запустить команду shopt -s extglob; ls !(*.txt)в одну строку (если extglobранее не задано), а необходимо добавить новую строку между двумя командами.

Однако это не относится к другим вариантам оболочки. Рассмотрим, например, следующее.

$ ls -a
.  ..  .hiddenFile  file1  file2  file3
$ shopt dotglob
dotglob         off
$ echo *
file1 file2 file3
$ shopt -s dotglob; echo *
.hiddenFile file1 file2 file3

Задокументировано ли где-нибудь, какие параметры оболочки используются анализатором extglobи, следовательно, не могут быть включены в групповой команде, которая их использует?

вshoptстраница в bashруководствеНичего о поведении, описанном выше, похоже, не упоминается.

решение1

Задокументировано ли где-нибудь, какие параметры оболочки используются анализатором, например extglob, и поэтому не могут быть включены в групповой команде, которая их использует?

Трудно доказать обратное, но я сомневаюсь, что существует исчерпывающий список.

Ниже приведены те, которые, по моему мнению, влияют на синтаксический анализ, могут быть и другие:

  • extglob-- изменяет значение скобок, которые в противном случае являются специальным символом
  • expand_aliases-- псевдонимы расширяются довольно рано в процессе обработки
  • extquote-- изменяет значение некоторых цитат
  • interactive_comments-- изменяет значение #в начале слова.

Некоторые из compat*вариантов также могут иметь схожие эффекты, но я оставлю их тестирование кому-то более заинтересованному.

С другой стороны, что-то вроде dotglob, failglobи globstarвлияет только на результат операции, а не на то, как она анализируется.

Что касается extglob, командная строка типа !(foo)действительна как с extglobset, так и без него. С ним это глоб, который соответствует всем файлам, кроме foo, а без него это подоболочка, запускающая команду foo, с инвертированным возвращаемым значением.


Обратите внимание, что на практике это не должно быть проблемой. В скрипте вы можете поместить команду shoptна отдельную строку, так что изменение в разборе повлияет на следующую строку без проблем. В однострочном скрипте вы можете использовать опцию -Oв командной строке, например, в bash -O extglob -c 'echo !(foo)', расширенный глоб работает.

Связанный контент