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' failglob
opzione 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 ls
senza 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 bash
cui sarebbe un peccato.
Per un'alternativa glob che funziona in entrambi zsh
e bash
, puoi usare i globs ksh ( set -o kshglob
dentro zsh
e shopt -s extglob
dentro bash
).
Quindi, faresti:
ls -d ./foldername/*.@(a|b|)test
o:
ls -d ./foldername/*.?([ab])test
Aggiungi l' failglob
opzione bash
per evitare che il glob venga passato letteralmente a ls
quando non corrisponde.
Vedi Perché nullglob non è predefinito? per maggiori informazioni.
/dev/null
?