¿Cómo hacer que `man` funcione para comandos y palabras clave incorporados en shell?

56

Uso el mancomando todo el tiempo cuando quiero obtener información sobre un comando específico. Pero esto no me ayuda demasiado cuando ese comando específico es un shell incorporado. Por ejemplo:

man cd

devoluciones:

No manual entry for cd

Mi pregunta es: es posible hacer mantambién el trabajo de toda la cáscara del orden interna comandos (como cd, alias, history, etc.), y las palabras clave (como if, while, [[, {, etc.)?

Radu Rădeanu
fuente
¿Y por qué echoes un comando incorporado pero tiene una página de manual?
Parto
55
@AvatarParto echotambién es un comando del sistema (ejecutable) ubicado en /bin. Puedes verificar esto usando type -a echo. Lo mismo sucede con timey tal vez con otros.
Radu Rădeanu
¿Ya exploraste info bash?
bbaassssiiee
Siempre puedes escribir tus propias páginas de manual.
Elliott Frisch

Respuestas:

66

El helpcomando cuando se usa con la -mopción puede mostrar información sobre comandos incorporados en formato de pseudo-página de manual. Por ejemplo:

help -m cd | less

mostrará información sobre el cdcomando en un formato casi exactamente como en una página de manual.

A partir de este comando, puede ajustar el mancomando en una función en su .bashrcarchivo de la siguiente manera:

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

Después de esto man, funcionará también para todos los comandos y palabras clave incorporados de shell. Por ejemplo:

man :

mostrará:

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
fuente
Enfoque muy inteligente! +1
phatskat
55
Si hay ejecutables enmascarados por builtins, puede especificar la sección. man timevs.man 1 time
Deja de dañar a Monica el
1
... tenga en cuenta que si usted es un zshusuario, no tiene tanta suerte: bugs.launchpad.net/ubuntu/+source/zsh/+bug/1242108 (no hay páginas de manual instaladas)
Rmano
info, help -m¿Por qué no podemos simplemente tener buenas páginas de manual en estos días? ¡Gracias de todos modos!
Tor Klingberg
+1 ... bien! El comportamiento de la función yr se parece un poco a lo que ocurre a través de la sobrecarga de funciones en C / C ++ ... Solo curiosamente man typeno produce una descripción de las opciones "-a" o "-t" en Ubuntu 14.04.4 .... y, sin embargo, estás ahí!
Cbhihe
28
man bash-builtins

Contiene fragmentos de ayuda para los comandos incorporados, aunque en un formato un poco más condensado que el helpequivalente.

Oli
fuente
¡Bueno saber! Es de la sección 7 del manual. No escuché sobre esta página del manual hasta ahora. +1, pero no puedo aceptar esta respuesta porque no es exactamente lo que pregunté.
Radu Rădeanu
En macOS High Sierra ese comando es simplemente "hombre integrado"
Tony Barganski
13

Puede instalar páginas de manual sobre el uso de un sistema POSIX para el desarrollo como,

sudo apt-get install manpages-posix-dev

Proporcionará páginas de manual para los componentes de shell.

$ type cd
cd is a shell builtin

Ahora intenta,

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

NAME
   cd - change the working directory

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


...
souravc
fuente
3
Estaba esperando que alguien viniera con esta respuesta. Pero el problema es que esto solo funcionará para algunas incorporaciones, las especificadas por POSIX .
Radu Rădeanu
3
Bash no se adhiere estrictamente a POSIX a menos que se ejecute en modo POSIX, por lo que estas páginas de manual pueden no ser exhaustivas y pueden estar equivocadas en algunas circunstancias, especialmente al describir el comportamiento de ciertas características.
Chris Down
@ RaduRădeanu sí, tienes toda la razón, funcionará para algunas construcciones.
souravc
3

Esta solución funciona perfectamente bien, pero también es una broma porque lo primero que pensé cuando leí tu pregunta fue '¿Quién sigue usando literalmente al hombre desde la línea de comando? ¿No todo el mundo solo busca en Google la página de manual que desean (para que puedan obtener cosas elegantes como desplazamiento ilimitado)? '. Luego me di cuenta de que los sitios en los que Google usualmente tienen ambos tipos de comandos, así que ¿por qué no solo usarlos para proporcionar una interfaz de página de manual uniforme en todos los comandos? Por lo tanto, nació esta diversión.

Esto requiere una conexión a Internet para cualquier entrada que no haya buscado al menos una vez. También necesita estas dos pequeñas aplicaciones que faltan en una instalación predeterminada de Ubuntu:

 sudo apt-get install tidy html2text

Estos no son absolutamente necesarios, pero ayudan a que se vea un poco mejor. Tidy limpiará el HTML y html2text formateará ese html como texto formateado (que generalmente es bastante trivial, ya que la mayoría de estos sitios ya tienen formato de texto y solo están envueltos en etiquetas <pre>.

Ahora todo lo que necesita hacer es agregar esto al final de ~/.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
}

Después de cerrar sesión y volver a ingresar, debería poder escribir esto:

iman cd

y mostrará la página del manual para cd.

Esto utiliza un directorio de datos (/ usr / share / iman) para minimizar nuestros requisitos de red (por lo que funcionará para las entradas que ya ha encontrado antes, incluso sin la conexión; también para minimizar la carga en este sitio aleatorio de páginas de manual de Linux Encontré con las entradas del sistema que también queremos en él). Si ya no usa esto, querrá eliminarlo para recuperar espacio en disco.

Con suerte, el resto es bastante sencillo.

krowe
fuente
66
'¿Quién todavía usa literalmente al hombre desde la línea de comando?' y todos los demás que tienen que visitar un centro de datos (sin internet;))
Rinzwind
Punto tomado, esto no te ayudará a ser claro.
krowe
66
Creo que el opuesto, rara vez uso Google para buscar comandos bash. Es mucho más rápido simplemente escribir "comando man" sin tener que abandonar el teclado.
Laurent
alt + tab -> alt + d -> el comando hará lo mismo sin mouse y sin cancelar el comando cli actual y con el desplazamiento y con un millón de otras cosas buenas que un navegador le ofrece. Estoy seguro de que no sabrías nada sobre eso porque siempre usas este sitio y otros como lynx ...
ffs
En el caso de las imanfunciones integradas, su función devuelve el mismo resultado que man bash-builtins.
Radu Rădeanu