Terminalbefehl zerlegt die Funktionalität

Terminalbefehl zerlegt die Funktionalität

Ich kenne einen Befehl, den ich ziemlich oft verwende, wenn ich an der Codebasis von jemand anderem arbeite. Hier ist ein Beispiel

find ./ -name "*.php" | xargs grep "my_awesome_function("

Ich habe bereits die Dokumentation zu jedem der Befehle hier durchgelesen, wie find, und von pipexargsgrephttp://www.computerhope.com/unix.htm

Ich verstehe jedoch immer noch nicht ganz, wie dieser Befehl nach allen PHP-Dateien vom aktuellen Verzeichnis abwärts sucht und dann herausfindet, welche davon die Zeichenfolge „my_awesome_function(“ enthalten. Ich verstehe, wie der Teil vor der Pipe funktioniert, aber nach der Pipe ist mein Verständnis dahin. Ich verstehe, dass jede Datei wie ein Argument an den Grep-Befehl gesendet wird. Kann mir jemand erklären, was hier passiert?

Antwort1

findVersuchen Sie, den Befehl ohne den letzten Teil auszuführen :

find ./ -name "*.php"

Sie sehen eine Liste von Dateinamen, die alle mit enden .php.

Nun xargliest der Befehl alle diese Dateinamen aus der Pipe, nimmt eine Reihe davon (Sie können mit der Option festlegen, wie viele -n 2) und ruft dann sein Argument mit diesen Namen auf. Wenn also die Ausgabe von find ist file1.php file2.php file3.phpund xarghöchstens zwei Dateien zusammenfassen würde (oder Sie es mit erzwingen xargs -n 2), dann würde es aufrufen

grep "my_awesome_function(" file1.php file2.php
grep "my_awesome_function(" file3.php

was wiederum Ihre Ausgabe erzeugt. Sie können sehen, was wirklich passiert, indem Sie Folgendes einfügen echo:

find ./ -name "*.php" | xargs echo grep "my_awesome_function("

Probieren Sie auch mit der Gruppierung herum:

find ./ -name "*.php" | xargs -n 2 echo grep "my_awesome_function("

verwandte Informationen