Чтобы понять практическое использование варианта Грепа -H в разных ситуациях

Этот вопрос основан на этом ответе.

Почему вы получаете тот же результат от обеих команд?

Команда A

$sudo grep muel *                                                             /tmp
masi:muel

Команда B

$sudo grep -H muel *                                                          /tmp
masi:muel

Комментарий Роба говорит мне, что команда A не должна давать мне masi:, но только muel.

Короче говоря, какова практическая цель -H?

Ответ 1

Grep будет перечислять имена файлов по умолчанию, если указано более одного имени файла. Опция -H позволяет сделать это, даже если задано только одно имя файла. В обоих примерах указано более одного имени файла.

Вот лучший пример:

$ grep Richie notes.txt
Richie wears glasses.

$ grep -H Richie notes.txt
notes.txt:Richie wears glasses.

Это более полезно, когда вы даете ему подстановочный знак для неизвестного количества файлов, и вы всегда хотите, чтобы имена файлов были напечатаны, даже если подстановочный знак соответствует только одному файлу.

Ответ 2

Если вы grep один файл, -H имеет значение:

$ grep muel mesi
muel

$ grep -H muel mesi
masi:muel

Это может быть значительным в различных контекстах сценариев. Например, script (или нетривиальная серия команд с каналами) может не знать, сколько файлов на самом деле имеет дело: один или несколько.

Ответ 3

Когда вы используете grep из нескольких файлов, по умолчанию отображается имя файла, в котором было найдено совпадение. Если вы укажете -H, имя файла всегда будет отображаться, даже если вы grep из одного файла. Вы можете указать -h, чтобы никогда не показывать имя файла.

Ответ 4

Emacs имеет интерфейс grep (M-x grep, M-x lgrep, M-x rgrep). Если вы попросите Emacs выполнить поиск foo в текущем каталоге, Emacs вызовет grep и обработает grep-вывод, а затем представит вам результаты с интерактивными ссылками. Кликируемые ссылки, как и Google.

Что Emacs делает, так это то, что он передает два параметра grep: -n (показать номер строки) и -H (показать имена файлов, даже если только один файл, точка - последовательность), а затем превратить вывод в интерактивные ссылки.

В целом, согласованность хороша для хорошего API, но согласованность конфликтует с DWIM.

Когда вы напрямую используете grep, вы хотите DWIM, поэтому вы не проходите мимо -H.