我想查找包含的目录中的所有文件-2
。
使用ls | grep "-2"
回报usage: grep...
使用单引号代替双引号会返回相同的结果,并且根本不使用引号,而正确搜索其他任何内容都会返回匹配的文件名。
我记得-
这不是一个正则表达式特殊字符。
请不要关注查找具有名称的文件的具体问题。我主要想了解 grep 的行为方式。
在 macOS 10.13 上使用 bash
答案1
这就像将 -2 解释为命令行参数,不管它是否被引号引起来。
grep
不知道参数是否用引号括起来。
在执行任何操作之前,许多解析步骤都是由 shell 本身1>
执行的 -应用重定向、$
扩展变量、*
扩展通配符、|
将管道拆分为一组单独的命令,并将每个命令拆分为一个单词数组。
因此,无论您运行grep -2
、grep '-2'
、grep \-2
还是x=-2; grep $x
,shell 仍会将其视为相同的参数列表:{ grep
, -2
}。这就是将传递给 execv() 系统调用的内容,也是grep程序将在其argv[]
数组中接收,无论原始引用如何。
1即使在 Windows 上,CreateProcess() 中的命令行只是一个字符串,但grep仍然会有这种行为,因为 C 运行时库在初始化期间执行相同的参数拆分。