我从 *.cmd 文件中看到很多 grepped 行。所以看来排除选项对我不起作用。
有一个名为nullglob 的shell 选项可以在没有匹配文件时控制shell 模式的扩展。
所以,给定以下环境:
sh$ touch f.cmd g.sh
sh$ mkdir sub
sh$ echo ckim > sub/h.cmd
sh$ echo ckim > sub/i.cmd
在 my 系统上(nullglob 未设置),以下命令:
grep --exclude=*.cmd ckim * -r
被外壳扩展(“理解”)为:
grep --exclude=*.cmd ckim f.cmd g.sh sub -r
也就是说,我将递归地 (-r) 搜索以f.cmd、g.sh 和g.sh 和sub 开头的字符串skim,但不包括与模式'* 匹配的任何文件.cmd'。
结果是:
# nullglob is unset
sh$ grep --exclude=*.cmd ckim * -r
sub/i.sh:ckim
但是如果在您的环境中设置了选项nullglob,则相同的命令扩展为:
grep ckim f.cmd g.sh sub -r
注意整个 --exclude=... 是如何消失的。所以结果是:
# nullglob is set
sh$ grep --exclude=*.cmd ckim * -r
sub/i.sh:ckim
sub/h.cmd:ckim
现在,解释一下。当 shell 遇到 glob 模式(即:包含 * 或 ? 或更多特殊字符)时,它会使用匹配的文件对其进行扩展。 但是如果没有匹配的文件,它要么让模式保持原样(如果nullglob 没有设置)或者用“nothing”替换它(如果nullglob已设置)。
这里的模式是--include=*.cmd(在整个,因为那里没有空间)。万一您有一个与此模式匹配的文件,它将被替换。否则,要么“原样”要么完全删除——取决于nullglob。
您可以轻松地显示、设置 (-s) 或取消设置 (-u) 当前 bash 的 nullglob 选项的状态:
sh$ shopt nullglob
nullglob on
sh$ shopt -u nullglob
sh$ shopt nullglob
nullglob off
sh$ shopt -s nullglob
sh$ shopt nullglob
nullglob on