Ich dachte, der Platzhalter *im Befehl find . -name *foo*wird durch Bash ersetzt, und dennoch funktioniert der Befehl, es sei denn, es *foo*stimmt etwas im aktuellen Verzeichnis überein, dann nicht. Es ist verwirrend.
basherweitert, *foo*weil es zusammenpasste, aber *bar*direkt bestanden, weil es nicht stimmte. Die nullglobOption weist bash an, nicht übereinstimmende Muster stattdessen in die leere Zeichenfolge aufzulösen:
find . -name *foo*
mitfind . -name '*foo*'
ihm wird es dem Platzhalter entspricht wie erwartet funktionieren.Antworten:
Wenn bash keine Übereinstimmung finden kann, wird die Literalzeichenfolge mit einem nicht erweiterten
*
Wert an die Anwendung übergeben . Zum Beispiel:bash
erweitert,*foo*
weil es zusammenpasste, aber*bar*
direkt bestanden, weil es nicht stimmte. Dienullglob
Option weist bash an, nicht übereinstimmende Muster stattdessen in die leere Zeichenfolge aufzulösen:quelle
zsh: no matches found
.no_nomatch
dieses Verhalten auslösen.Wenn Sie die
find
nicht erweiterte Zeichenfolge erhalten möchten , können Sie sie zitieren oder die Platzhalter mit Backslashes schützen.quelle