En
ls -d ./foldername/*.{a,b,}test
{a,b,...} no es un operador global, eso es expansión de llaves, primero se expande para:
ls -d ./foldername/*.atest ./foldername/*.btest ./foldername/*.test
Y cada globo se expandió individualmente, y si algún globo no coincide, el comando se cancela como es de esperar en zsh(o fish; en bash, necesita la failglobopción de obtener un comportamiento similar).
Aquí, querrás usar un único globo que coincida con todos esos archivos, y solo cancelar el comando si ese globo no coincide con ningún archivo:
ls -d ./foldername/*.(a|b|)test
No desea utilizarlo nullglob, ya que si ninguno de los globs coincidiera, se ejecutaría lssin argumentos, así que enumere el directorio actual. cshnullglobes mejor en ese sentido, ya que elimina los globos que no coinciden pero aún cancela el comando si todos los globos no coinciden.
No querrás usarlo nonomatch, ya que eso te daría un comportamiento roto, lo bashcual sería una pena.
Para una alternativa glob que funcione en ambos zshy bash, puede usar los globos ksh ( set -o kshglobin zshy shopt -s extglobin bash).
Entonces, harías:
ls -d ./foldername/*.@(a|b|)test
o:
ls -d ./foldername/*.?([ab])test
Agregue la failglobopción bashpara evitar que el glob se pase literalmente a lscuando no coincida.
Consulte ¿Por qué nullglob no es el predeterminado? para más información.
/dev/null?