Bash 对grep--include/--exclude选项的混淆
我在Cygwin中遇到了grep--include/--exclude选项的一个奇怪用法。 以下3个命令输出相同的结果: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
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
文件。