我正在学习扩展/命令替换,并在查看示例时注意到这两个命令有不同的结果。
例如,如果我进入 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*