¿Cómo `man git init` obtiene la página de manual correcta?

52

Entonces, parece que escribir man git initen un indicador de bash en un sistema Ubuntu 14.04 hace lo mismo que man git-init, solo que no estoy muy seguro de cómo.

La manpágina para man(es decir man man) no parece permitir esta construcción, a menos que gitera una sectiondel manual, pero la página hombre parece venir de la sección 1.

¿Es este un uso no documentado compatible con man? ¿He entendido mal la documentación de man? ¿Está ocurriendo alguna otra magia? ¿A alguien le importa explicar?

mc0e
fuente
Parece como si git-init simplemente puede ser un contenedor paragit init
Jeff Schaller

Respuestas:

71

Algunas implementaciones de man, incluida la utilizada por Ubuntu, reemplazan espacios en sus términos de búsqueda con guiones e intentan encontrar una página de manual con ese nombre. Entonces man git initbusca lo mismo que man git-init. Del mismo modo, man run partsy man ntfs 3gtrabajar (si tiene run-partsy ntfs-3gen su sistema).

Sin embargo, solo hace esto con pares de palabras, por lo man git annex syncque no funciona (aunque man git-annex syncsí, ya que nuevamente es un par de palabras).

De hecho, cuando solicita dos páginas de manual (por ejemplo, man git bashpara ver las páginas de manual de git y bash), en manrealidad primero trata de buscar una página de git-bashmanual. Puede ver esto en la salida de depuración si lo habilita con -d.

Esta función de hombre se llama "subpáginas". Puede leer el código fuente implementando subpáginas en man-db (gracias, Stephen Kitt ). Buscar en la man(1)página de manual para "subpáginas" también le llevará a la descripción de este comportamiento bajo la --no-subpagesopción:

--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
fuente
Esto parece no funcionar en CentOS 6.6. ¿Es solo Ubuntu?
Comodín
1
@Wildcard, ¿qué parte parece no funcionar? Debería funcionar siempre que CentOS esté usando man-db (hay otras manimplementaciones), y las subpáginas no se han deshabilitado (por ejemplo, con --no-subpages). Estoy usando Debian, por lo que definitivamente no es solo Ubuntu.
derobert
2
Lo importante es que esto es exclusivo de una implementación específica de man. De ninguna manera es universal o común en particular.
chepner