„ls | grep zip“ vs. „grep zip $(ls)“

„ls | grep zip“ vs. „grep zip $(ls)“

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/binund 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 grepder 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 zipder grepBefehl eine Liste von Dateinamen auf seiner Standardeingabe und durchsucht diese.

In grep zip $(ls)ersetzt die Shell die Ergebnisse des lsBefehls durch eine Liste von Wörtern, die grepsie 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*

verwandte Informationen