Comment faire fonctionner man pour les commandes et les mots-clés intégrés au shell?

56

J'utilise la mancommande tout le temps quand je veux obtenir des informations sur une commande spécifique. Mais cela ne m'aide pas beaucoup quand cette commande spécifique est un shell intégré. Par exemple:

man cd

résultats:

No manual entry for cd

Ma question est: il est possible de faire mantravailler aussi pour toutes les commandes SHELL (comme cd, alias, history, etc.), et des mots - clés (comme if, while, [[, {, etc.)?

Radu Rădeanu
la source
Et comment se echofait-il qu'une commande intégrée ait une page de manuel?
Parto
5
@AvatarParto echoest également une commande système (exécutable) située dans /bin. Vous pouvez vérifier cela en utilisant type -a echo. La même chose arrive avec timeet peut-être d'autres.
Radu Rădeanu
Avez-vous explorer info bashencore?
bbaassssiiee
Vous pouvez toujours écrire vos propres pages de manuel.
Elliott Frisch

Réponses:

66

La helpcommande when est utilisée avec -moption peut afficher des informations sur les commandes intégrées au format pseudo-manpage. Par exemple:

help -m cd | less

affichera des informations sur la cdcommande dans un format presque identique à celui d'une page de manuel.

À partir de cette commande, vous pouvez insérer une mancommande dans une fonction de votre .bashrcfichier, comme suit:

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

Après cela manfonctionnera également pour toutes les commandes et mots-clés intégrés au shell. Par exemple:

man :

Affichera:

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
la source
Approche très intelligente! +1
phatskat
5
S'il existe des exécutables masqués par les commandes intégrées, vous pouvez spécifier la section. man timecontreman 1 time
arrêt Maltraiter Monica
1
... Notez bien que si vous êtes un zshutilisateur, vous n'êtes pas aussi chanceux: bugs.launchpad.net/ubuntu/+source/zsh/+bug/1242108 (pas de pages de manuel installées)
Rmano
info, help -mpourquoi ne pouvons-nous pas simplement avoir de bonnes pages de manuel ces jours-ci? En tout cas, merci!
Tor Klingberg
+1 ... bien! Le comportement de yr function ressemble quelque peu à ce qui se passe avec la surcharge de fonctions en C / C ++ ... Seulement, curieusement, man typene produit pas une description des options "-a" ou "-t" dans Ubuntu 14.04.4 .... et pourtant, elles êtes là!
Cbhihe
28
man bash-builtins

Cela contient des extraits d’aide pour les commandes intégrées, mais dans un format légèrement plus condensé que l’ helpéquivalent.

Oli
la source
Bon à savoir! Cela provient de la section 7 du manuel. Je n'ai pas entendu parler de cette page de manuel jusqu'à maintenant. +1, mais je ne peux pas accepter cette réponse car ce n'est pas exactement ce que j'ai demandé.
Radu Rădeanu
Sur macOS High Sierra, cette commande est tout simplement "intégrée à l'homme"
Tony Barganski
13

Vous pouvez installer des pages de manuel sur l’utilisation d’un système POSIX pour le développement en tant que,

sudo apt-get install manpages-posix-dev

Il fournira des pages de manuel pour les commandes intégrées au shell.

$ type cd
cd is a shell builtin

Maintenant essaye,

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

NAME
   cd - change the working directory

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


...
souravc
la source
3
J'attendais que quelqu'un vienne avec cette réponse. Mais le problème est que cela ne fonctionnera que pour certaines fonctions intégrées, celles spécifiées par POSIX .
Radu Rădeanu
3
Bash n’adhère pas strictement à POSIX sauf s’il est exécuté en mode POSIX. Par conséquent, ces pages de manuel risquent de ne pas être complètes et d’être erronées dans certaines circonstances, notamment lors de la description du comportement de certaines fonctionnalités.
Chris Down
@ RaduRădeanu oui vous avez tout à fait raison, cela fonctionnera pour certaines fonctions intégrées.
Souravc
3

Cette solution fonctionne parfaitement mais est un peu une blague aussi parce que la première chose à laquelle j'ai pensé en lisant votre question était: «Qui utilise encore littéralement man depuis la ligne de commande? Tout le monde ne recherche-t-il pas simplement dans la page de manuel de son choix (pour obtenir des fonctionnalités sophistiquées telles que le défilement illimité)? '. Je me suis ensuite rendu compte que les sites que je recherche généralement en Google ont les deux types de commandes, alors pourquoi ne pas les utiliser pour fournir une interface de page de manuel uniforme pour toutes les commandes. Par conséquent, ce plaisir est né.

Cela nécessite une connexion Internet pour toutes les entrées que vous n'avez pas déjà consultées au moins une fois. Il a également besoin de ces deux petites applications qui manquent dans une installation par défaut d'Ubuntu:

 sudo apt-get install tidy html2text

Celles-ci ne sont pas absolument nécessaires, mais elles aident à rendre l’apparence un peu plus agréable. Tidy nettoiera le code HTML et html2text formatera celui-ci en tant que texte formaté (ce qui est généralement assez trivial, car la plupart de ces sites sont déjà formatés et entourés de balises <pre>.

Maintenant, tout ce que vous avez à faire est d’ajouter ceci à la fin 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
}

Après vous être déconnecté puis revenu, vous devriez pouvoir taper ceci:

iman cd

et il affichera la page de manuel pour cd.

Ceci utilise un répertoire de données (/ usr / share / iman) afin de minimiser les exigences de notre réseau (afin que cela fonctionne pour les entrées que vous avez déjà trouvées même sans connexion), ainsi que pour réduire la charge sur ce site de pages de manuel linux aléatoires. J'ai trouvé avec les entrées du système que nous voulons aussi). Si vous ne l'utilisez plus, vous voudrez le supprimer pour récupérer de l'espace disque.

Espérons que le reste est assez simple.

Krowe
la source
6
"Qui utilise encore littéralement l'homme depuis la ligne de commande?" Moi! et tous les autres qui doivent se rendre dans un centre de données (pas d'Internet;))
Rinzwind
Point pris, cela ne vous aidera pas à être clair.
Krowe
6
Je pense que l’opposé, j’utilise rarement Google pour rechercher des commandes bash. Il est beaucoup plus rapide de simplement taper "man command" sans avoir à quitter le clavier.
laurent
alt + tab -> alt + d -> commande fera la même chose sans souris et sans annuler la commande cli en cours et avec le défilement et avec un million d'autres choses sympas qu'un navigateur vous donne. Je suis sûr que vous ne saurez rien à ce sujet car vous utilisez toujours ce site et d’autres sites similaires à Lynx ... ffs
krowe
En cas d'intégrations, votre imanfonction retourne la même sortie que man bash-builtins.
Radu Rădeanu