команда терминала разбивает функциональность

команда терминала разбивает функциональность

Я знаю команду, которую я использую довольно часто, работая с чужой кодовой базой, вот пример

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

Я уже прочитал документацию по каждой из команд здесь, как find, pipe, xargsи grepот http://www.computerhope.com/unix.htm

Но я все еще не совсем понимаю, как эта команда ищет каждый php-файл из текущего каталога и вниз, а затем ищет, какой из них содержит строку "my_awesome_function(". Я понимаю, как работает часть до конвейера, но после конвейера мое понимание исчезает. Я понимаю, что каждый файл отправляется как аргумент команде grep, может кто-нибудь объяснить, что здесь происходит?

решение1

Попробуйте выполнить findкоманду без последней части:

find ./ -name "*.php"

Вы увидите список имен файлов, все из которых заканчиваются на .php.

Теперь xargкоманда считывает все эти имена файлов из конвейера, берет их кучу (вы можете задать, сколько их, используя option -n 2), а затем вызывает свой аргумент с этими именами. Так что если вывод find равен file1.php file2.php file3.php, и xargбудет группировать максимум два файла вместе (или вы принудительно это делаете с помощью xargs -n 2), то он вызовет

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

который в свою очередь производит ваш вывод. Вы можете увидеть, что на самом деле происходит, вставив echo:

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

Также поиграйтесь с группировкой:

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

Связанный контент