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' failglob
option 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 ls
sans arguments, alors listez le répertoire courant. cshnullglob
est 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é bash
qui serait dommage.
Pour une alternative glob qui fonctionne à la fois dans zsh
et bash
, vous pouvez utiliser les globs ksh ( set -o kshglob
in zsh
et shopt -s extglob
in bash
).
Ensuite, vous feriez:
ls -d ./foldername/*.@(a|b|)test
ou:
ls -d ./foldername/*.?([ab])test
Ajoutez l' failglob
option in bash
pour éviter que le glob ne soit transmis littéralement ls
lorsqu'il ne correspond pas.
Voir Pourquoi nullglob n'est-il pas par défaut? pour plus d'informations.
/dev/null
?