Как `man git init` получает нужную справочную страницу?


52

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

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

Это недокументированное использование поддерживается man? Я неправильно понял документацию man? Происходит ли какая-то другая магия? Кто-нибудь хочет объяснить?


Похоже, что git-init может быть просто оберткой дляgit init
Джефф Шаллер

Ответы:


71

Некоторые реализации 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), manфактически сначала пытается найти справочную страницу git-bash. Вы можете увидеть это в выходных данных отладки, если вы включите его с помощью -d.

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

Кажется, это не работает на CentOS 6.6. Это только Ubuntu?
Wildcard

1
@ Wildcard, какая часть, кажется, не работает? Он должен работать, пока CentOS использует man-db (есть другие manреализации), а подстраницы не отключены (например, с помощью --no-subpages). Я использую Debian, так что это определенно не только Ubuntu.
Дероберт

2
Важно то, что это уникально для конкретной реализации man. Это ни в коем случае не универсальное или частное общее.
chepner
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.