Расширенные скобки подстановки в bash прерывают инициализацию массива

Я использовал оператор echo *([!min]).css, чтобы получить все имена файлов в текущем каталоге с расширением .css, кроме файлов с расширением .min.css. Это сработало на баше.

Однако, когда я использую это для инициализации массива в таком сценарии bash

files=(*([!min]).css)

это больше не работает. Баш говорит, что где-то есть неожиданная открывающая скобка. Подсветка синтаксиса в моем редакторе также выглядит так, как будто скобки глобуса внутри инициализации массива неверны, однако я не смог понять это правильно.

Любой совет? Спасибо.

РЕДАКТИРОВАТЬ: Я использую GNU Bash 4.3.033 на ArchLinux.


person nsommer    schedule 10.05.2015    source источник
comment
@Cyrus Нет, та же ошибка.   -  person nsommer    schedule 10.05.2015
comment
files = $ ((* ([! min]). css)) попробовать ??   -  person Amit Sharma    schedule 10.05.2015
comment
@Cyrus: расширение пути не выполняется в правой части назначений переменных (не в виде массива).   -  person mklement0    schedule 10.05.2015


Ответы (1)


Чтобы использовать расширенные глобусы, необходимо включить параметр оболочки extglob. Поместите его в начало вашего скрипта, чуть ниже shebang:

#!/usr/bin/env bash
shopt -s extglob
#...
files=( !(*.min).css )
#...

Обратите внимание, что параметры оболочки не наследуются, поэтому даже если у вас может быть включен extglob в интерактивном bash, из которого вы запускаете скрипт, вам все равно нужно явно включить его в скрипте.

person geirha    schedule 10.05.2015
comment
Я уже объяснил, что сам глобус работал вне сценария в bash, так что проблема не в этом. - person nsommer; 10.05.2015
comment
@nsommer, это просто означает, что вы включили его в интерактивном сеансе (возможно, путем завершения bash). По умолчанию он отключен и поэтому не работает в вашем скрипте. - person geirha; 10.05.2015
comment
Престижность за то, что понял это правильно; Я предлагаю вам добавить к самому ответу ловушку, связанную с extglob потенциально включением в интерактивных оболочках из-за файлов инициализации, но не в скриптах. - person mklement0; 10.05.2015
comment
@geirha Спасибо за терпение, похоже, вы правы. Я действительно пытался включить extglobs в скрипте, прежде чем это не приводило к правильному выполнению. Я предполагаю, что раньше это была проблема с самим глобусом, при использовании вашего примера после последнего редактирования все работает. - person nsommer; 11.05.2015