У меня есть структура каталогов, как это:

.
├── dir
│   └── src
│       └── file.c
├── dir_a1
│   └── src
│       └── file.c
└── dir_a2
    └── src
        └── file.c

Когда я запускаю следующую команду, результаты ожидаются:

echo dir{,_a[12]}/**/*.c 
#
dir/src/file.c
dir_a1/src/file.c
dir_a2/src/file.c

Если я удалю file.c из dir_a2, результаты все равно будут в порядке:

rm dir_a2/src/file.c
echo dir{,_a[12]}/**/*.c
#
dir/src/file.c
dir_a1/src/file.c

Но когда я удаляю file.c из dir, результаты для этого каталога портятся:

rm dir/src/file.c
echo dir{,_a[12]}/**/*.c
#
dir/**/*.c
dir_a1/src/file.c

Почему bash решил удалить результат расширения для dir_a2, а не для dir?

globstar включен в оболочке.

1 ответ1

1

Расширение скобки (то есть {this,that,etc}) Не является глобусом файла, то есть оно распространяется на все значения независимо от того, существует файл с таким именем или нет. Таким образом, dir{,_a[12]}/**/*.c расширяется до двух шаблонов глобуса dir/**/*.c и dir_a[12]/**/*.c Второй расширяется до единственного соответствующего файла, dir_a1/src/file.c , но первый ничего не совпадает и поэтому остается один (и поэтому он буквально повторяется).

Если вы не хотите пропускать непараллельные глобусы, установите nullglob оболочки nullglob через shopt -s nullglob . Но имейте в виду, что это заставит другие вещи действовать странным образом, например, ls /etc/*.nosuchextension перечисляющий содержимое текущего каталога. Другим способом обработки непревзойденных глобусов является опция оболочки failglob .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .