Come far funzionare `man` per comandi e parole chiave integrati nella shell?


56

Uso sempre il mancomando quando voglio ottenere informazioni su un comando specifico. Ma questo non mi aiuta molto quando quel comando specifico è incorporato nella shell. Per esempio:

man cd

ritorna:

No manual entry for cd

La mia domanda è: è possibile fare mananche funzionare per tutti builtin di shell comandi (come cd, alias, history, etc.), e le parole chiave (come if, while, [[, {, etc.)?


E come mai echoè un comando incorporato ma ha una pagina man?
Parto,

5
@AvatarParto echoè anche un comando di sistema (eseguibile) che si trova in /bin. Puoi verificarlo usando type -a echo. La stessa cosa accade con timee forse altri.
Radu Rădeanu,

Hai già esplorato info bash?
bbaassssiiee,

Puoi sempre scrivere le tue pagine man.
Elliott Frisch,

Risposte:


66

Il helpcomando quando utilizzato con l' -mopzione può visualizzare informazioni sui comandi integrati in formato pseudo-manpage. Per esempio:

help -m cd | less

visualizzerà le informazioni sul cdcomando in un formato quasi esattamente come in una pagina di manuale.

A partire da questo comando è possibile racchiudere il mancomando in una funzione nel .bashrcfile come segue:

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

Dopodiché manfunzionerà anche con tutti i comandi e le parole chiave incorporati nella shell. Per esempio:

man :

visualizzerà:

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>

Approccio molto intelligente! +1
phatskat,

5
Se ci sono eseguibili mascherati da builtin, è possibile specificare la sezione. man timevs.man 1 time
Smetti di danneggiare Monica il

1
... nota però che se sei un zshutente non sei così fortunato: bugs.launchpad.net/ubuntu/+source/zsh/+bug/1242108 (nessuna pagina man installata)
Rmano

info, help -mperché non possiamo avere buone pagine man in questi giorni? Comunque grazie!
Tor Klingberg,

+1 ... bello! Il comportamento della funzione yr assomiglia in qualche modo a ciò che accade attraverso il sovraccarico della funzione in C / C ++ ... Solo curiosamente man typenon produce una descrizione delle opzioni "-a" o "-t" in Ubuntu 14.04.4 .... eppure ci sei!
Cbhihe,

28
man bash-builtins

Questo contiene frammenti di aiuto per i comandi integrati, sebbene in un formato leggermente più condensato rispetto helpall'equivalente.


Buono a sapersi! Viene dalla sezione 7 del manuale. Non ho sentito parlare di questa pagina di manuale fino ad ora. +1, ma non posso accettare questa risposta perché non è esattamente quello che ho chiesto.
Radu Rădeanu,

Su macOS High Sierra quel comando è semplicemente "man builtins"
Tony Barganski il

13

È possibile installare pagine di manuale sull'uso di un sistema POSIX per lo sviluppo come,

sudo apt-get install manpages-posix-dev

Fornirà pagine man per i builtin della shell.

$ type cd
cd is a shell builtin

Adesso prova,

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

NAME
   cd - change the working directory

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


...

3
Stavo aspettando che arrivasse qualcuno con questa risposta. Ma il problema è che funzionerà solo con alcuni builtin - quelli specificati da POSIX .
Radu Rădeanu,

3
Bash non aderisce rigorosamente a POSIX a meno che non venga eseguito in modalità POSIX, quindi queste pagine man potrebbero non essere complete e potrebbero essere errate in alcune circostanze, specialmente quando descrivono il comportamento di determinate funzionalità.
Chris Down,

@ RaduRădeanu sì, hai assolutamente ragione, funzionerà per alcuni builtin.
souravc,

3

Questa soluzione funziona perfettamente, ma è anche un po 'uno scherzo perché la prima cosa che ho pensato quando ho letto la tua domanda è stata: "Chi usa ancora letteralmente l'uomo dalla riga di comando? Google non è solo la pagina man che desidera (in modo da ottenere cose fantasiose come lo scorrimento illimitato)? '. Poi mi sono reso conto che i siti che Google di solito hanno tutti e due i tipi di comandi, quindi perché non utilizzarli solo per fornire un'interfaccia man page uniforme su tutti i comandi. Quindi, questo divertimento è nato.

Ciò richiede una connessione Internet per tutte le voci che non hai già cercato almeno una volta. Ha anche bisogno di queste due piccole app che mancano in un'installazione predefinita di Ubuntu:

 sudo apt-get install tidy html2text

Questi non sono assolutamente necessari, ma aiutano a renderlo un po 'più bello. Tidy pulirà l'HTML e html2text formatterà quell'html come testo formattato (che di solito è piuttosto banale poiché la maggior parte di questi siti sono già formattati in testo e racchiusi in tag <pre>.

Ora tutto ciò che devi fare è aggiungere questo alla fine di ~/.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
}

Dopo aver effettuato il logout e poi di nuovo l'accesso, dovresti essere in grado di digitare questo:

iman cd

e mostrerà la pagina man per cd.

Questo utilizza una directory di dati (/ usr / share / iman) al fine di ridurre al minimo i nostri requisiti di rete (quindi funzionerà per le voci che hai già trovato prima anche senza la connessione; anche per minimizzare il carico su questo sito di pagine man linux casuali Ho trovato anche con le voci di sistema che vogliamo). Se non lo usi più, ti consigliamo di rimuoverlo per recuperare spazio su disco.

Spero che il resto sia piuttosto semplice.


6
"Chi usa ancora letteralmente l'uomo dalla riga di comando?" Io! e tutti gli altri che devono visitare un datacenter (no internet;))
Rinzwind

Punto preso, questo non ti aiuterà quindi ad essere chiaro.
Krowe,

6
Direi il contrario, uso raramente Google per cercare i comandi bash. È molto più veloce digitare "man command" senza dover lasciare la tastiera.
Laurent,

alt + tab -> alt + d -> comando farà lo stesso senza mouse e senza cancellare il comando cli corrente e con scorrimento e con un milione di altre cose carine che ti dà un browser. Sono sicuro che non ne sapresti nulla perché i tuoi usano sempre questo sito e altri lo apprezzano da lynx ... ffs
krowe

Nel caso di builtin, la tua imanfunzione restituisce lo stesso output di man bash-builtins.
Radu Rădeanu,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.