Im
ls -d ./foldername/*.{a,b,}test
{a,b,...} ist kein Glob-Operator, das ist eine Klammererweiterung, die zuerst erweitert wurde auf:
ls -d ./foldername/*.atest ./foldername/*.btest ./foldername/*.test
Und jeder Glob wird einzeln erweitert, und wenn ein Glob nicht übereinstimmt, wird der Befehl wie erwartet abgebrochen zsh(oder fish; in bashbenötigen Sie die failglobOption, um ein ähnliches Verhalten zu erzielen).
Hier möchten Sie einen einzelnen Glob verwenden, der mit all diesen Dateien übereinstimmt, und den Befehl nur abbrechen, wenn dieser eine Glob keiner Datei entspricht:
ls -d ./foldername/*.(a|b|)test
Sie möchten nicht verwenden nullglob, als ob keiner der Globs übereinstimmt, es würde lsohne Argumente ausgeführt, also listen Sie das aktuelle Verzeichnis auf. cshnullglobist in dieser Hinsicht besser, da nicht übereinstimmende Globs entfernt werden, der Befehl jedoch abgebrochen wird, wenn nicht alle Globs übereinstimmen.
Sie würden nicht verwenden wollen nonomatch, da dies Ihnen das gebrochene Verhalten geben bashwürde, dessen Schande eine Schande wäre.
Für eine Glob-Alternative, die in beiden zshund funktioniert bash, können Sie die ksh-Globs ( set -o kshglobin zshund shopt -s extglobin bash) verwenden.
Dann würden Sie tun:
ls -d ./foldername/*.@(a|b|)test
oder:
ls -d ./foldername/*.?([ab])test
Fügen Sie die failglobOption hinzu bash, um zu vermeiden, dass der Globus buchstäblich an übergeben wird, lswenn er nicht übereinstimmt.
Siehe Warum ist nullglob nicht die Standardeinstellung? für mehr Informationen.
/dev/null?