Der Unterschied liegt nicht darin grep; es ist in der Schale. grepsieht nie die Zitate.
Wildcard
Antworten:
17
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 greperhalten Sie die Option --includemit dem Argument *.pl. Das ist die 4-stellige Zeichenfolge mit dem *Zeichen als erstem Zeichen. Was grepmit dieser Zeichenfolge zu tun hat, liegt ganz bei Ihnen grep. In diesem Fall --includebedeutet 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 *.plauf alle Dateinamen, die auf enden .pl. Angenommen , es sind die Dateien foo.pl, bar.plund baz.pl. Nach dem Erweitern sieht die Befehlszeile folgendermaßen aus:
grep "string".-r --include foo.pl bar.pl baz.pl
Hier greperhalten Sie die Option --includemit dem Argument foo.pl, gefolgt von den Optionen bar.plund baz.pl. --include foo.plbedeutet, 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.plund baz.plMittel grep suchen auch in diesen Dateien, aber da sie nicht mit dem Muster übereinstimmen, foo.plwerden sie ignoriert.
Dies ist eine großartige Beobachtung. Ich habe mich immer gefragt, warum es grep -rinkonsistent schien, aber ich habe nie bemerkt, dass es nur war, wenn ich ein verwendet habe *.
j883376
6
Der Unterschied besteht darin, dass das Muster ( *.pl) durch die Shell erweitert wird, wenn Sie es nicht zitieren . Wenn Sie beispielsweise Ihre grepDatei in einem Verzeichnis ausführen , das eine aufgerufene Datei enthält foo.pl, da die *plvon der Shell erweitert wird, wird greptatsä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 greperhält den richtigen Befehl, nämlich
grep
; es ist in der Schale.grep
sieht nie die Zitate.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:
Hier
grep
erhalten Sie die Option--include
mit dem Argument*.pl
. Das ist die 4-stellige Zeichenfolge mit dem*
Zeichen als erstem Zeichen. Wasgrep
mit dieser Zeichenfolge zu tun hat, liegt ganz bei Ihnengrep
. 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:
Hier erweitert die Shell das Muster zunächst
*.pl
auf alle Dateinamen, die auf enden.pl
. Angenommen , es sind die Dateienfoo.pl
,bar.pl
undbaz.pl
. Nach dem Erweitern sieht die Befehlszeile folgendermaßen aus:Hier
grep
erhalten Sie die Option--include
mit dem Argumentfoo.pl
, gefolgt von den Optionenbar.pl
undbaz.pl
.--include foo.pl
bedeutet, nur Dateien zu berücksichtigen, die dem Muster entsprechenfoo.pl
. Da das Muster keine Platzhalter enthält, ist die einzige übereinstimmende Datei die benannte Dateifoo.pl
.Die Optionen
bar.pl
undbaz.pl
Mittel grep suchen auch in diesen Dateien, aber da sie nicht mit dem Muster übereinstimmen,foo.pl
werden sie ignoriert.quelle
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 Ihregrep
Datei in einem Verzeichnis ausführen , das eine aufgerufene Datei enthältfoo.pl
, da die*pl
von der Shell erweitert wird, wirdgrep
tatsächlich Folgendes angezeigt: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ämlichquelle
peopl
wird nicht erweitert durch*.pl
.