W jaki sposób `man git init` dostaje odpowiednią stronę man?

52

Wygląda więc na to, że wpisanie man git initbashu w systemie Ubuntu 14.04 robi to samo man git-init, ale nie jestem pewien, jak to zrobić.

manAktualizacja man(tj man man) wydaje się nie dopuszczać do tego konstruktu, chyba gitbyło sectioninstrukcji, ale strona, człowiek wydaje się pochodzić z sekcji 1.

Czy jest to obsługiwane przez nieudokumentowane użycie man? Czy źle zrozumiałem dokumentację man? Czy dzieje się jakaś inna magia? Czy ktoś chciałby to wyjaśnić?

Mc0e
źródło
Wygląda na to, że git-init może być tylko opakowaniemgit init
Jeff Schaller

Odpowiedzi:

71

Niektóre implementacje man, w tym ta używana przez Ubuntu, zastępują spacje w wyszukiwanych hasłach myślnikami i próbują znaleźć stronę podręcznika pod tą nazwą. Więc man git initszuka tego samego man git-init. Podobnie man run partsi man ntfs 3gdziała (jeśli masz run-partsi ntfs-3gna swoim systemie).

Dzieje się tak tylko z parami słów, więc man git annex syncnie działa (choć man git-annex syncdziała, ponieważ to znowu para słów).

W rzeczywistości, gdy poprosisz o dwie strony podręcznika (np. man git bashAby zobaczyć zarówno strony podręcznika git, jak i bash), manfaktycznie najpierw szukasz strony git-bashpodręcznika. Możesz to zobaczyć w wynikach debugowania, jeśli włączysz to za pomocą -d.

Ta funkcja man nazywa się „podstronami”, możesz przeczytać kod źródłowy implementujący podstrony w man-db (dzięki, Stephen Kitt ). Przeszukiwanie strony man(1)podręcznej w celu znalezienia „podstron” prowadzi również do opisu tego zachowania w --no-subpagesopcji:

--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
źródło
To wydaje się nie działać na CentOS 6.6. Czy to tylko Ubuntu?
Wildcard
1
@Wildcard, która część wydaje się nie działać? Powinien działać, dopóki CentOS używa man-db (istnieją inne manimplementacje), a podstrony nie zostały wyłączone (np. Z --no-subpages). Używam Debiana, więc zdecydowanie nie jest to tylko Ubuntu.
derobert
2
Ważne jest to, że jest to unikalne dla konkretnego wdrożenia man. W żadnym wypadku nie jest to powszechne ani szczególnie powszechne.
chepner