В
ls -d ./foldername/*.{a,b,}test
{a,b,...}
это не глобальный оператор, это расширение скобки, которое сначала расширяется до:
ls -d ./foldername/*.atest ./foldername/*.btest ./foldername/*.test
И каждый глобус расширяется индивидуально, и, если какой-либо глобус не совпадает, команда отменяется, как и следовало ожидать zsh
(или fish
; bash
вам нужна failglob
опция для получения аналогичного поведения).
Здесь вы хотите использовать один глобус, который соответствует всем этим файлам, и отменять команду, только если этот глобус не соответствует ни одному файлу:
ls -d ./foldername/*.(a|b|)test
Вы не хотите использовать nullglob
, как если бы ни один из глобусов не совпадал, он работал бы ls
без аргументов, поэтому перечислите текущий каталог. cshnullglob
лучше в этом отношении, поскольку он удаляет несовпадающие глобусы, но все равно отменяет команду, если все глобусы не совпадают.
Вы не хотели бы использовать nonomatch
, поскольку это дало бы вам нарушенное поведение, bash
которое было бы позором.
Для альтернативы glob, которая работает как в, так zsh
и в bash
, вы можете использовать глобусы ksh ( set -o kshglob
in zsh
и shopt -s extglob
in bash
).
Тогда вы бы сделали:
ls -d ./foldername/*.@(a|b|)test
или:
ls -d ./foldername/*.?([ab])test
Добавьте failglob
опцию, bash
чтобы глобус не передавался буквально, ls
когда он не совпадает.
См. Почему nullglob не используется по умолчанию? за дополнительной информацией.
/dev/null
?