В
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 kshglobin zshи shopt -s extglobin bash).
Тогда вы бы сделали:
ls -d ./foldername/*.@(a|b|)test
или:
ls -d ./foldername/*.?([ab])test
Добавьте failglobопцию, bashчтобы глобус не передавался буквально, lsкогда он не совпадает.
См. Почему nullglob не используется по умолчанию? за дополнительной информацией.
/dev/null?