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 bash
benötigen Sie die failglob
Option, 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 ls
ohne Argumente ausgeführt, also listen Sie das aktuelle Verzeichnis auf. cshnullglob
ist 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 bash
würde, dessen Schande eine Schande wäre.
Für eine Glob-Alternative, die in beiden zsh
und funktioniert bash
, können Sie die ksh-Globs ( set -o kshglob
in zsh
und shopt -s extglob
in bash
) verwenden.
Dann würden Sie tun:
ls -d ./foldername/*.@(a|b|)test
oder:
ls -d ./foldername/*.?([ab])test
Fügen Sie die failglob
Option hinzu bash
, um zu vermeiden, dass der Globus buchstäblich an übergeben wird, ls
wenn er nicht übereinstimmt.
Siehe Warum ist nullglob nicht die Standardeinstellung? für mehr Informationen.
/dev/null
?