grep "--exclude=" 在文件扩展名过滤时取消 "--include="

NK-*_*ell 1 bash grep

我只想 grep 源代码中的头文件。似乎它是众所周知的并且已经解决了问题,但--include=对我不起作用:

$ grep -rnI --include=\*.h 'static volatile'
net/ipv4/ipconfig.c:174:static volatile int ic_got_reply __initdata;    /* Proto(s) that replied */
drivers/mtd/maps/sbc_gxx.c:83:static volatile int page_in_window = -1; // Current page in window.
drivers/parport/parport_mfc3.c:79:static volatile int dummy; /* for trigger readds */
^C
Run Code Online (Sandbox Code Playgroud)

我希望只有带.h扩展名的头文件。
顺便说一句,--exclude=工作正常:

$ grep -rnI --exclude=\*.c 'static volatile'
arch/mips/include/asm/mach-pmcs-msp71xx/msp_gpio_macros.h:63:static volatile u32 * const MSP_GPIO_DATA_REGISTER[] = {
arch/mips/include/asm/mach-pmcs-msp71xx/msp_gpio_macros.h:83:static volatile u32 * const MSP_GPIO_MODE_REGISTER[] = {
arch/arm/mach-w90x900/include/mach/uncompress.h:28:static volatile u32 * const uart_base = (u32 *)UART0_PA;
arch/arm/mach-gemini/include/mach/uncompress.h:19:static volatile unsigned long * const UART = (unsigned long *)GEMINI_UART_BASE;
^C
Run Code Online (Sandbox Code Playgroud)

更新:

$ grep --version
grep (GNU grep) 2.27
...

$ type grep
grep is aliased to `grep --color --exclude=tags --exclude-dir="build*"'
Run Code Online (Sandbox Code Playgroud)

但是当别名以这种方式取消时效果很好:$ \grep -rnI --include=\*.h 'static volatile'.
那么为什么要--exclude=取消--include=呢?

Sun*_*eep 5

有关别名覆盖,请参阅:如何覆盖 .bash_aliases 中设置的别名

我找不到有关多个包含/排除规则如何影响为匹配选择的最终文件列表的文档。但我认为可以安全地假设,在发生冲突时,命令行中最新定义的规则会获胜。

  • --exclude=tags 将忽略名称完全相同的任何文件或目录 tags
  • --include='*.h'将允许.h匹配任何以 结尾的文件

在这种情况下,两个规则之间没有冲突。第一个允许grep选择任何未命名的文件tags。第二个告诉grep允许任何以.h


在类似冲突的情况下--exclude='*foo.txt' --include='*.txt'包括规则将覆盖排除规则与结尾的文件foo.txt将被视为匹配