Como o 'man git init' consegue a man page certa?

50

Então parece que digitar man git init em um prompt do bash em um sistema Ubuntu 14.04 faz o mesmo que man git-init , mas não tenho certeza de como.

A página man para man (ou seja, man man ) parece não permitir essa construção, a menos que git seja um section do manual, mas a página man parece vir da seção 1 .

Este é um uso não documentado suportado por man ? Eu compreendi mal a documentação de man ? Alguma outra mágica está acontecendo? Alguém se importa em explicar?

    
por mc0e 23.02.2016 / 17:50

1 resposta

68

Algumas implementações de man , incluindo a usada pelo Ubuntu, substituem espaços em seus termos de pesquisa por hifens e tentam localizar uma página de manual com esse nome. Portanto, man git init procura a mesma coisa que man git-init . Da mesma forma, man run parts e man ntfs 3g work (se você tiver run-parts e ntfs-3g em seu sistema).

Ele só faz isso com pares de palavras, portanto, man git annex sync não funciona (embora man git-annex sync faça, já que isso é novamente um par de palavras).

Na verdade, quando você solicita duas páginas de manual (por exemplo, man git bash para ver as páginas de manual git e bash), man tenta primeiro procurar uma% man_de% manpage. Você pode ver isso na saída de depuração se você ativá-lo com git-bash .

Este recurso de homem é chamado de "subpáginas", você pode ler o código-fonte implementando subpáginas no man-db (obrigado, Stephen Kitt ). A pesquisa na -d manpage para "subpáginas" também o levará à descrição de esse comportamento na opção man(1) :

--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
    
por 23.02.2016 / 18:15

Tags