In
ls -d ./foldername/*.{a,b,}test
{a,b,...} non è un operatore glob, questa è un'espansione di parentesi graffe, che per la prima volta viene espansa a:
ls -d ./foldername/*.atest ./foldername/*.btest ./foldername/*.test
E ogni glob si espande individualmente e, se un glob non corrisponde, il comando viene annullato come ci si aspetterebbe zsh(o fish; in bash, è necessaria l' failglobopzione per ottenere un comportamento simile).
Qui, vorrai utilizzare un singolo glob che corrisponda a tutti quei file e annullare il comando solo se quel glob non corrisponde a nessun file:
ls -d ./foldername/*.(a|b|)test
Non si desidera utilizzare nullglob, come se nessuno dei globs corrispondesse, verrebbe eseguito lssenza argomenti, quindi elencare la directory corrente. cshnullglobè migliore a tale riguardo in quanto rimuove globi non corrispondenti ma annulla comunque il comando se tutti i globi non corrispondono.
Non vorrai usare nonomatch, poiché ciò ti darebbe il comportamento rotto di bashcui sarebbe un peccato.
Per un'alternativa glob che funziona in entrambi zshe bash, puoi usare i globs ksh ( set -o kshglobdentro zshe shopt -s extglobdentro bash).
Quindi, faresti:
ls -d ./foldername/*.@(a|b|)test
o:
ls -d ./foldername/*.?([ab])test
Aggiungi l' failglobopzione bashper evitare che il glob venga passato letteralmente a lsquando non corrisponde.
Vedi Perché nullglob non è predefinito? per maggiori informazioni.
/dev/null?