Ich lerne gerade etwas über die Erweiterung/Befehlsersetzung und habe beim Herumexperimentieren mit einem Beispiel bemerkt, dass diese beiden Befehle unterschiedliche Ergebnisse haben.
Wenn ich beispielsweise mit cd in gehe /usr/bin
und ausführe ls | grep zip
, erkennt grep nur „zip“ in den Dateinamen.
Aber wenn ich es grep zip $(ls)
im selben Verzeichnis ausführe, erkennt grep auch zip im Dateiinhalt. Warum? Ubuntu 16.04.
Ich weiß, dass das eine Anfängerfrage ist, aber es wäre trotzdem hilfreich zu wissen, warum. Danke.
Antwort1
Dies liegt daran, dass grep
der Betrieb in zwei unterschiedlichen Modi erfolgen kann:
DESCRIPTION grep searches the named input FILEs for lines containing a match to the given PATTERN. If no files are specified, or if the file “-” is given, grep searches standard input. By default, grep prints the matching lines.
In sieht ls | grep zip
der grep
Befehl eine Liste von Dateinamen auf seiner Standardeingabe und durchsucht diese.
In grep zip $(ls)
ersetzt die Shell die Ergebnisse des ls
Befehls durch eine Liste von Wörtern, die grep
sie wie Dateinamenargumente behandelt und jedes Argument nacheinander nach dem Muster durchsucht zip
.
WICHTIGER HINWEIS: Wenn einer der Dateinamen Leerzeichen enthält, werden die durch Leerzeichen getrennten Teile als separate Argumente behandelt, was zu No such file or directory
Fehler.Eine sicherere Möglichkeit, nach übereinstimmenden Dateien zu suchen, ist die Verwendung von Shell-Globs, z. B.grep 'pattern' *zip*