Bash 对grep--include/--exclude选项的混淆

Bash 对grep--include/--exclude选项的混淆,bash,grep,cygwin,Bash,Grep,Cygwin,我在Cygwin中遇到了grep--include/--exclude选项的一个奇怪用法。 以下3个命令输出相同的结果: 1) grep -rl --include \*.c "copyright" ./* 2) grep -rl --include=\*.c "copyright" ./* 3) grep -rl --include=*.c "copyright" ./* 然后我检查了GNU Grep文档是否只提到了“-include=glob”用法,因此对于上述3个用例,我有两个混淆: 1

我在Cygwin中遇到了grep--include/--exclude选项的一个奇怪用法。 以下3个命令输出相同的结果

1) grep -rl --include \*.c "copyright" ./*
2) grep -rl --include=\*.c "copyright" ./*
3) grep -rl --include=*.c "copyright" ./*
然后我检查了GNU Grep文档是否只提到了“-include=glob”用法,因此对于上述3个用例,我有两个混淆:
1) 为什么“=”可以忽略?
2) 为什么像我在许多在线解决方案中看到的那样,需要对“*”字符进行“转义”

希望有人能帮我解决困惑,提前谢谢

致以最诚挚的问候,
cmjauto

然而,奇怪的是,*.cpp和*.cpp在我的 一边

我想你的意思是\*.cpp和*.cpp都有效。这是因为
bash
在处理单词
--include=*.cpp
时,会查找具有这样一个名称的文件(以
--include=
开头,以
.cpp
结尾),在默认设置下,如果这样一个文件不存在,它会保持单词的原样。通过使用
\
对其进行转义,禁用文件名扩展,可以实现将
*
保留在原位的相同效果


当然,建议显式转义
*
字符,而不要指望运气好,没有与模式匹配的文件名。

最后一个
--include=*.c
zsh
中对我不起作用。另外,我猜POSIX同时接受
--option=value
--option-value
@fedorqui。谢谢您的友好回复,您知道问题2的原因吗?)这是因为
*
在Bash中有一个特殊的含义:扩展到当前目录中的所有元素。使用
\*
我们跳过此扩展。例如,说
ls*
,您将看到所有元素;相反,如果你说
ls\*
它会尝试匹配一个名为
*
@fedorqui的文件,是的,*是一个元字符,但是如果我想在当前目录下包含所有的.cpp文件,我会使用.cpp,对吗?因为没有文件的名称中包含“”。我理解正确吗?然而,奇怪的是,*.cpp和*.cpp在我这方面都起作用。它是否与您所在的同一目录中的文件相匹配,还是与某些子目录中的文件相匹配?这是有意义的,它只是第一个,这可以通过以下事实来解释:
*
甚至在执行
grep
之前就扩展到当前目录中的所有
.c
文件。