此问题基于this answer。
为什么从两个命令获得相同的输出?
命令A
$sudo grep muel * /tmp
masi:muel
命令B
$sudo grep -H muel * /tmp
masi:muel
Rob的评论告诉我 Command A 不应该给我masi:
,而只能muel
。
简而言之, -H
的实际目的是什么?
答案 0 :(得分:12)
如果给出了多个文件名,Grep将默认列出文件名。即使只给出一个文件名,-H
选项也会这样做。在两个示例中,都给出了多个文件名。
这是一个更好的例子:
$ grep Richie notes.txt
Richie wears glasses.
$ grep -H Richie notes.txt
notes.txt:Richie wears glasses.
当您为未知数量的文件提供通配符时,它会更有用,即使通配符只匹配一个文件,您也总是希望打印文件名。
答案 1 :(得分:5)
如果你grep一个文件,-H会有所不同:
$ grep muel mesi
muel
$ grep -H muel mesi
masi:muel
这在各种脚本环境中可能很重要。例如,一个脚本(或一个非平凡的管道系列命令)可能不知道它实际处理的文件数量:一个或多个。
答案 2 :(得分:1)
当您从多个文件中进行grep时,默认情况下会显示找到匹配项的文件的名称。如果指定-H,则即使从单个文件grep,也将始终显示文件名。您可以指定-h从不显示文件名。
答案 3 :(得分:1)
Emacs有grep接口(M-x grep,M-x lgrep,M-x rgrep)。如果您要求Emacs在当前目录中搜索foo,那么Emacs会调用grep并处理grep输出,然后向您显示带有可点击链接的结果。可点击的链接,就像谷歌一样。
Emacs做的是它将两个选项传递给grep:-n(显示行号)和-H(显示文件名即使只有一个文件。点是一致性)然后将输出转换为可点击链接。
通常,一致性有利于成为一个好的API,但一致性与DWIM冲突。
直接使用grep时,您需要DWIM,因此不要传递-H。