*为什么*在 find/grep 中使用 /dev/null 会显示文件名?

*为什么*在 find/grep 中使用 /dev/null 会显示文件名?
find . -name "*.java" -exec grep "foo" {} \;

这仅打印匹配项,没有文件名。

find . -name "*.java" -exec grep "foo" /dev/null {} \;

但这也会打印文件名。

为什么?当 /dev/null 插入到混合中时,find/grep 的哪些机制会导致打印文件名?

PS-是的,我知道我可以做“grep -H”

答案1

如果您既不使用 -h 选项也不使用 -H 选项,那么当有多个文件作为参数时,grep 将写出文件名。因此,如果您将 /dev/null 作为参数添加到 grep,您将始终拥有多个文件,因此文件名将始终被写入。但是,是的,使用 ˛grep -H是始终写入文件名的最安全方法。

答案2

我猜想grep,当搜索多个文件时,会在匹配的行前面输出文件名,以区分在哪里找到该行。否则,如果仅指定一个文件,则用户已经知道该行会在哪个文件中找到。

用于grep -h关闭输出中的文件名,或者grep -H强制打开它们。

相关内容