“ls | grep zip” 与 “grep zip $(ls)”

“ls | grep zip” 与 “grep zip $(ls)”

我正在学习扩展/命令替换,并在查看示例时注意到这两个命令有不同的结果。

例如,如果我进入 cd/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),shell 将ls命令的结果替换为单词列表,该列表grep视为文件名参数,依次搜索每个单词以查找模式zip

重要提示:如果任何文件名包含空格,则空格分隔的部分将被视为单独的参数,从而导致 No such file or directory 错误。搜索匹配文件的更安全的方法是使用 shell globs,例如grep 'pattern' *zip*

相关内容