Como o `man git init` obtém a página do manual correta?

52

Portanto, parece que digitar man git initem um prompt do bash em um sistema Ubuntu 14.04 faz o mesmo que man git-init, só não sei bem como.

A manpágina para man(ie man man) parece não permitir essa construção, a menos que gitseja sectionparte do manual, mas a página de manual parece vir da seção 1.

Este uso não documentado é suportado por man? Entendi mal a documentação man? Alguma outra mágica está acontecendo? Alguém quer explicar?

mc0e
fonte
Parece que o git-init pode ser apenas um invólucro paragit init
Jeff Schaller

Respostas:

71

Algumas implementações man, incluindo a usada pelo Ubuntu, substituem espaços em seus termos de pesquisa por hífens e tentam encontrar uma página de manual com esse nome. Então, man git initparece a mesma coisa que man git-init. Da mesma forma, man run partse man ntfs 3gtrabalhe (se você tiver run-partse ntfs-3gno seu sistema).

Porém, ele só faz isso com pares de palavras, portanto man git annex syncnão funciona (embora funcione man git-annex sync, pois é novamente um par de palavras).

De fato, quando você pede duas páginas de manual (por exemplo, man git bashpara ver as páginas de manual git e bash), manna verdade , primeiro tenta procurar uma página de git-bashmanual. Você pode ver isso na saída de depuração, se você habilitá-lo com -d.

Esse recurso man é chamado de "subpáginas". Você pode ler o código fonte implementando subpáginas no man-db (obrigado, Stephen Kitt ). A pesquisa de "subpáginas" na página de man(1)manual também levará você à descrição desse comportamento na --no-subpagesopção:

--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
derobert
fonte
Isso parece não funcionar no CentOS 6.6. É apenas o Ubuntu?
Curinga
11
@Wildcard que parte parece não funcionar? Deverá funcionar enquanto o CentOS estiver usando o man-db (existem outras manimplementações) e as subpáginas não foram desativadas (por exemplo, com --no-subpages). Estou usando o Debian, então definitivamente não é apenas o Ubuntu.
derobert 23/02
2
O importante é que isso seja exclusivo para uma implementação específica do man. Não é de modo algum universal ou particular comum.
Chepner