«ls | grep zip» против «grep zip $(ls)»

«ls | grep zip» против «grep zip $(ls)»

Я изучаю расширение/подстановку команд и, разбираясь с примером, заметил, что эти две команды дают разные результаты.

Например, если я перейду в /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*

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