Wie kann man `man` für Shell-Befehle und Schlüsselwörter arbeiten lassen?

56

Ich verwende den manBefehl immer dann, wenn ich Informationen zu einem bestimmten Befehl erhalten möchte. Aber das hilft mir nicht allzu viel, wenn dieser spezielle Befehl eine eingebaute Shell ist. Zum Beispiel:

man cd

kehrt zurück:

No manual entry for cd

Meine Frage ist: ist es möglich zu machen , manauch für alle Shell - builtin Befehle funktionieren (wie cd, alias, historyusw.) und Schlüsselwörter (wie if, while, [[, {, etc.)?

Radu Rădeanu
quelle
Und wie kommt echoes, dass ein eingebauter Befehl eine Manpage hat?
Parto
5
@AvatarParto echoist auch ein Systembefehl (ausführbar) in /bin. Sie können dies mit überprüfen type -a echo. Dasselbe passiert mit timeund vielleicht mit anderen.
Radu Rădeanu
Hast du schon erforscht info bash?
Baassssiiee
Sie können jederzeit eigene Manpages schreiben .
Elliott Frisch

Antworten:

66

Der helpBefehl , wenn sie mit verwendet wird -mOption können Informationen über eingebaute Befehle im Format pseudo-Man - Page anzuzeigen. Zum Beispiel:

help -m cd | less

Zeigt Informationen zu cdBefehlen in einem Format an, das fast genau einer man-Seite entspricht.

Ausgehend von diesem Befehl können Sie den manBefehl .bashrcwie folgt in eine Funktion in Ihrer Datei einbinden:

man () {
    case "$(type -t -- "$1")" in
    builtin|keyword)
        help -m "$1" | sensible-pager
        ;;
    *)
        command man "$@"
        ;;
    esac
}

Danach manfunktioniert das auch für alle in die Shell eingebauten Befehle und Schlüsselwörter. Zum Beispiel:

man :

wird anzeigen:

NAME
    : - Null command.

SYNOPSIS
    :

DESCRIPTION
    Null command.

    No effect; the command does nothing.

    Exit Status:
    Always succeeds.

SEE ALSO
    bash(1)

IMPLEMENTATION
    GNU bash, version 4.2.45(1)-release (x86_64-pc-linux-gnu)
    Copyright (C) 2011 Free Software Foundation, Inc.
    License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
Radu Rădeanu
quelle
Sehr kluger Ansatz! +1
phatskat
5
Wenn es ausführbare Dateien gibt, die durch integrierte Funktionen maskiert sind, können Sie den Abschnitt angeben. man timevs.man 1 time
Stopp Harming Monica
1
... beachten Sie, dass Sie, wenn Sie ein zshBenutzer sind, nicht so viel Glück haben: bugs.launchpad.net/ubuntu/+source/zsh/+bug/1242108 (keine Manpages installiert)
Rmano
info, help -m, Warum können wir nicht einfach nur gute Mann Seiten in diesen Tagen? Trotzdem danke!
Tor Klingberg
+1 ... schön! Das Verhalten Ihrer Funktion ähnelt in gewisser Weise dem, was durch Funktionsüberladung in C / C ++ auftritt ... Nur seltsamerweise man typeergibt sich keine Beschreibung der Optionen "-a" oder "-t" in Ubuntu 14.04.4 .... und doch, sie 'sind da !
Cbhihe
28
man bash-builtins

Dies enthält Hilfefragmente für die eingebauten Befehle, allerdings in einem etwas komprimierteren Format als dem helpentsprechenden.

Oli
quelle
Gut zu wissen! Es ist aus Abschnitt 7 des Handbuchs. Ich habe bis jetzt nichts von dieser Handbuchseite gehört. +1, aber ich kann diese Antwort nicht akzeptieren, weil es nicht genau das ist, was ich gefragt habe.
Radu Rădeanu
Auf macOS High Sierra ist dieser Befehl einfach "man builtins"
Tony Barganski
13

Sie können Handbuchseiten zur Verwendung eines POSIX-Systems für die Entwicklung als

sudo apt-get install manpages-posix-dev

Es werden Manpages für Shell-Buildins bereitgestellt.

$ type cd
cd is a shell builtin

Jetzt versuch mal,

$ man cd
CD(P)                      POSIX Programmer's Manual                      CD(P)

NAME
   cd - change the working directory

SYNOPSIS
   cd [-L | -P] [directory]


...
souravc
quelle
3
Ich habe darauf gewartet, dass jemand mit dieser Antwort kommt. Das Problem ist jedoch, dass dies nur für einige von POSIX festgelegte Buildins funktioniert .
Radu Rădeanu
3
Bash hält sich nicht strikt an POSIX, es sei denn, es wird im POSIX-Modus ausgeführt. Daher sind diese Manpages möglicherweise nicht vollständig und können unter bestimmten Umständen falsch sein, insbesondere wenn das Verhalten bestimmter Funktionen beschrieben wird.
Chris Down
@ RaduRădeanu ja du bist absolut korrekt, es wird für einige builtins funktionieren.
souravc
3

Diese Lösung funktioniert einwandfrei, ist aber auch ein Scherz, denn das erste, was ich dachte, als ich Ihre Frage las, war: "Wer benutzt den Menschen noch buchstäblich von der Kommandozeile aus?" Werden nicht alle nur die von ihnen gewünschte Manpage googeln (so dass sie Lust auf uneingeschränktes Scrollen haben)? '. Dann wurde mir klar, dass die Websites, die ich bei Google normalerweise verwende, beide Arten von Befehlen aufweisen. Warum also nicht einfach eine einheitliche Manpage-Oberfläche für alle Befehle verwenden? Somit war dieser Spaß geboren.

Dies erfordert eine Internetverbindung für alle Einträge, die Sie noch nicht mindestens einmal nachgeschlagen haben. Außerdem benötigt es diese zwei kleinen Apps, die in einer Standardinstallation von Ubuntu fehlen:

 sudo apt-get install tidy html2text

Diese werden nicht unbedingt benötigt, tragen aber dazu bei, dass es ein bisschen schöner aussieht. Tidy bereinigt den HTML-Code und html2text formatiert diesen HTML-Code als formatierten Text (was normalerweise ziemlich trivial ist, da die meisten dieser Websites bereits textformatiert und nur in <pre> -Tags eingeschlossen sind.

Alles was Sie jetzt tun müssen, ist dies am Ende von ~/.profile:

function iman() {
    if [ ! -d "/usr/share/iman" ]; then
        sudo mkdir -m a=rwx /usr/share/iman
    fi
    if [ ! -f "/usr/share/iman/$1.html" ]; then
        curl "http://unixhelp.ed.ac.uk/CGI/man-cgi?$1"| tidy -n -asxml 2>/dev/null| html2text > "/usr/share/iman/$1.html"; 
    fi
    if [ -f "/usr/share/iman/$1.html" ]; then
        cat "/usr/share/iman/$1.html";
    else
        echo "Entry not found."
    fi
}

Nach dem Abmelden und erneutem Anmelden sollten Sie Folgendes eingeben können:

iman cd

und es wird die Manpage für angezeigt cd.

Dabei wird ein Datenverzeichnis (/ usr / share / iman) verwendet, um die Netzwerkanforderungen zu minimieren (damit dies auch ohne Verbindung für bereits zuvor gefundene Einträge funktioniert) und um die Belastung dieser zufälligen Linux-Manpages-Site zu minimieren Ich habe mit den Systemeinträgen gefunden, die wir auch darin haben wollen). Wenn Sie diese Option nicht mehr verwenden, möchten Sie sie entfernen, um Speicherplatz freizugeben.

Hoffentlich ist der Rest ziemlich direkt.

krowe
quelle
6
»Wer benutzt den Menschen noch buchstäblich von der Kommandozeile?« Ich! und alle anderen, die ein Rechenzentrum besuchen müssen (kein Internet;))
Rinzwind
Punkt genommen, das hilft dir dann nicht klar zu sein.
Krowe
6
Ich würde das Gegenteil denken, ich benutze selten Google, um Bash-Befehle nachzuschlagen. Es ist viel schneller, einfach "man command" einzugeben, ohne die Tastatur verlassen zu müssen.
Laurent
alt + tab -> alt + d -> befehl macht das gleiche ohne maus und ohne abbrechen des aktuellen cli befehls und mit scrollen und mit einer million anderer netter sachen, die dir ein browser bietet. Ich bin mir sicher, dass Sie nichts darüber wissen würden, weil Sie diese Site immer nutzen und andere, die sie von lynx mögen ... ffs
krowe
Bei eingebauten imanFunktionen gibt Ihre Funktion die gleiche Ausgabe zurück wie man bash-builtins.
Radu Rădeanu