Я изучаю расширение/подстановку команд и, разбираясь с примером, заметил, что эти две команды дают разные результаты.
Например, если я перейду в /usr/bin
, и запущу ls | grep zip
, grep найдет «zip» только в именах файлов.
Но когда я запускаю grep zip $(ls)
в том же каталоге, grep также подбирает zip в содержимом файла. Почему? Ubuntu 16.04.
Я знаю, что это вопрос новичка, но все равно было бы полезно узнать, почему. Спасибо.
решение1
Это связано с тем, что grep
он может работать в двух различных режимах:
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.
В ls | grep zip
, grep
команда видит список имен файлов на стандартном вводе и выполняет поиск в нем.
В grep zip $(ls)
оболочка подставляет результаты команды ls
в виде списка слов, который grep
обрабатывается как аргументы имени файла, поочередно выполняя поиск по шаблону zip
.
ВАЖНОЕ ПРИМЕЧАНИЕ: если какое-либо из имен файлов содержит пробелы, то разделенные пробелами части будут рассматриваться как отдельные аргументы, что приведет к No such file or directory
ошибки.Более безопасный способ поиска соответствующих файлов — использовать подстановки оболочки, например:grep 'pattern' *zip*