Чтобы понять практическое использование варианта Грепа -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.