Antworten:
Der *
(Stern oder Stern) ist ein Sonderzeichen, das (normalerweise) von der Shell interpretiert wird, bevor sie den Befehl erhält. Es wird (normalerweise) auf alle Dateinamen mit Ausnahme derjenigen mit führenden Punkten erweitert. Weitere Informationen finden Sie im Bash-Handbuch zum Pattern Matching .
Wenn der Stern in Anführungszeichen gesetzt wird, wird er von der Shell nicht interpretiert und dem Befehl wörtlich übergeben.
Beispiele erklärt. Der Zitierte:
grep "string" . -r --include "*.pl"
Hier grep
erhalten Sie die Option --include
mit dem Argument *.pl
. Das ist die 4-stellige Zeichenfolge mit dem *
Zeichen als erstem Zeichen. Was grep
mit dieser Zeichenfolge zu tun hat, liegt ganz bei Ihnen grep
. In diesem Fall --include
bedeutet dies, nur Dateien zu berücksichtigen, die dem Muster entsprechen *.pl
.
AFAIK hinter den Kulissen gnu grep verwendet das gleiche Muster, das lib entspricht wie gnu bash.
Der nicht zitierte:
grep "string" . -r --include *.pl
Hier erweitert die Shell das Muster zunächst *.pl
auf alle Dateinamen, die auf enden .pl
. Angenommen , es sind die Dateien foo.pl
, bar.pl
und baz.pl
. Nach dem Erweitern sieht die Befehlszeile folgendermaßen aus:
grep "string" . -r --include foo.pl bar.pl baz.pl
Hier grep
erhalten Sie die Option --include
mit dem Argument foo.pl
, gefolgt von den Optionen bar.pl
und baz.pl
. --include foo.pl
bedeutet, nur Dateien zu berücksichtigen, die dem Muster entsprechen foo.pl
. Da das Muster keine Platzhalter enthält, ist die einzige übereinstimmende Datei die benannte Datei foo.pl
.
Die Optionen bar.pl
und baz.pl
Mittel grep suchen auch in diesen Dateien, aber da sie nicht mit dem Muster übereinstimmen, foo.pl
werden sie ignoriert.
grep -r
inkonsistent schien, aber ich habe nie bemerkt, dass es nur war, wenn ich ein verwendet habe *
.
Der Unterschied besteht darin, dass das Muster ( *.pl
) durch die Shell erweitert wird, wenn Sie es nicht zitieren . Wenn Sie beispielsweise Ihre grep
Datei in einem Verzeichnis ausführen , das eine aufgerufene Datei enthält foo.pl
, da die *pl
von der Shell erweitert wird, wird grep
tatsächlich Folgendes angezeigt:
grep "string" . -r --include foo.pl
Da Sie angeben, dass es nur enthalten soll foo.pl
, wird nur diese eine Datei durchsucht.
Wenn Sie Ihr Muster zitieren, wird es von der Shell nicht erweitert und grep
erhält den richtigen Befehl, nämlich
grep "string" . -r --include *pl
peopl
wird nicht erweitert durch *.pl
.
grep
; es ist in der Schale.grep
sieht nie die Zitate.