Dans
ls -d ./foldername/*.{a,b,}test
{a,b,...} n'est pas un opérateur glob, c'est une expansion d'accolade, c'est d'abord étendu à:
ls -d ./foldername/*.atest ./foldername/*.btest ./foldername/*.test
Et chaque glob est développé individuellement, et si un glob ne correspond pas, la commande est annulée comme vous pouvez vous y attendre zsh(ou fish; in bash, vous avez besoin de l' failgloboption pour obtenir un comportement similaire).
Ici, vous souhaitez utiliser un seul glob qui correspond à tous ces fichiers et annuler la commande uniquement si ce glob ne correspond à aucun fichier:
ls -d ./foldername/*.(a|b|)test
Vous ne voulez pas utiliser nullglob, comme si aucun des globes ne correspondait, il s'exécuterait lssans arguments, alors listez le répertoire courant. cshnullglobest meilleur à cet égard car il supprime les globes non correspondants mais annule toujours la commande si tous les globs ne correspondent pas.
Vous ne voudriez pas l'utiliser nonomatch, car cela vous donnerait un comportement cassé bashqui serait dommage.
Pour une alternative glob qui fonctionne à la fois dans zshet bash, vous pouvez utiliser les globs ksh ( set -o kshglobin zshet shopt -s extglobin bash).
Ensuite, vous feriez:
ls -d ./foldername/*.@(a|b|)test
ou:
ls -d ./foldername/*.?([ab])test
Ajoutez l' failgloboption in bashpour éviter que le glob ne soit transmis littéralement lslorsqu'il ne correspond pas.
Voir Pourquoi nullglob n'est-il pas par défaut? pour plus d'informations.
/dev/null?