Как «man git init» получает правильную страницу руководства?

Таким образом, кажется, что ввод текста man git init в подсказку bash на системе Ubuntu 14.04 делает то же самое, что и man git-init , но я не совсем уверен, как это сделать.

man страница для man (т. Е. man man ), похоже, не допускает эту конструкцию, если только git был section руководства, но, похоже, страница-man появилась из раздела 1 .

Является ли это недокументированным использованием, поддерживаемым man ? Я неправильно понял документацию о man ? Есть ли какая-то другая магия? Кто-нибудь должен объяснить?

Некоторые реализации man , в том числе используемые Ubuntu, заменяют пробелы в своих поисковых терминах дефисом и пытаются найти страницу руководства под этим именем. Итак, man git init ищет то же, что и man git-init . Аналогично, man run parts и man ntfs 3g работают (если у вас есть run-parts и ntfs-3g в вашей системе).

Это делает только это с помощью пар слов, поэтому man git annex sync не работает (хотя man git-annex sync делает, так как это снова пара слов).

Фактически, когда вы запрашиваете две страницы руководства (например, man git bash чтобы увидеть как git, так и bash manpages), man самом деле сначала пытается найти справочную страницу git-bash . Вы можете увидеть это на выходе отладки, если вы включите его с помощью -d .

Эта функция человека называется «подстраницами», вы можете прочитать исходный код, реализующий подстраницы в man-db (спасибо, Стивен Китт ). Поиск man(1) manpage для «подстраниц» также приведет вас к описанию этого поведения в опции --no-subpages :

 --no-subpages By default, man will try to interpret pairs of manual page names given on the command line as equivalent to a single manual page name containing a hyphen or an underscore. This supports the common pattern of programs that implement a number of subcommands, allowing them to provide manual pages for each that can be accessed using similar syntax as would be used to invoke the subcommands themselves. For example: $ man -aw git diff /usr/share/man/man1/git-diff.1.gz To disable this behaviour, use the --no-subpages option. $ man -aw --no-subpages git diff /usr/share/man/man1/git.1.gz /usr/share/man/man3/Git.3pm.gz /usr/share/man/man1/diff.1.gz