Como fazer com que o `man` funcione para comandos e palavras-chave embutidas no shell?

56

Eu uso o mancomando o tempo todo quando quero obter informações sobre um comando específico. Mas isso não me ajuda muito quando esse comando específico é um shell embutido. Por exemplo:

man cd

retorna:

No manual entry for cd

A minha pergunta é: é possível fazer mantambém funcionar para todos shell builtin comandos (como cd, alias, history, etc.), e palavras-chave (como if, while, [[, {, etc.)?

Radu Rădeanu
fonte
E como echoé um comando interno, mas tem uma página de manual?
Parto 26/03
5
O @AvatarParto echotambém é um comando do sistema (executável) localizado em /bin. Você pode verificar isso usando type -a echo. O mesmo acontece com timee talvez outros.
Radu Rădeanu 26/03
Você já explorou info bash?
bbaassssiiee
Você sempre pode escrever suas próprias páginas de manual.
Elliott Frisch

Respostas:

66

O helpcomando quando é usado com a -mopção pode exibir informações sobre comandos internos no formato pseudo-página de manual. Por exemplo:

help -m cd | less

exibirá informações sobre o cdcomando em um formato quase exatamente como em uma página de manual.

A partir deste comando, você pode agrupar o mancomando em uma função do seu .bashrcarquivo da seguinte maneira:

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

Depois disso man, também funcionará para todos os comandos e palavras-chave do shell embutido. Por exemplo:

man :

Exibirá:

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
fonte
Abordagem muito inteligente! 1
phatskat
5
Se houver executáveis ​​mascarados por componentes internos, você poderá especificar a seção man timevsman 1 time
Pare de prejudicar Monica
11
... nota embora que se você é um zshusuário a sua não têm tanta sorte: bugs.launchpad.net/ubuntu/+source/zsh/+bug/1242108 (sem páginas man instaladas)
Rmano
info, help -m, Por que não podemos apenas ter boas páginas do homem nos dias de hoje? De qualquer forma, obrigado!
Tor Klingberg
+1 ... legal! O comportamento da função yr se parece um pouco com o que ocorre através da sobrecarga de função no C / C ++ ... Curiosamente man type, não produz uma descrição das opções "-a" ou "-t" no Ubuntu 14.04.4 .... e, no entanto, elas tá aí!
Cbhihe
28
man bash-builtins

Isso contém trechos de ajuda para os comandos internos, embora em um formato um pouco mais condensado que o helpequivalente.

Oli
fonte
Bom saber! É da seção 7 do manual. Eu não tinha ouvido falar desta página de manual até agora. +1, mas não posso aceitar esta resposta porque não é exatamente o que eu pedi.
Radu Rădeanu 26/03
No macOS High Sierra, esse comando é simplesmente "construído por homem"
Tony Barganski
13

Você pode instalar páginas de manual sobre o uso de um sistema POSIX para desenvolvimento como,

sudo apt-get install manpages-posix-dev

Ele fornecerá páginas de manual para os shell buildins.

$ type cd
cd is a shell builtin

Agora tente,

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

NAME
   cd - change the working directory

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


...
souravc
fonte
3
Eu estava esperando alguém vir com esta resposta. Mas o problema é que isso funcionará apenas para alguns componentes internos - aqueles especificados pelo POSIX .
Radu Rădeanu 27/03
3
O Bash não adere estritamente ao POSIX, a menos que seja executado no modo POSIX, portanto, essas páginas de manual podem não ser abrangentes e podem estar erradas em algumas circunstâncias, especialmente ao descrever o comportamento de determinados recursos.
Chris Baixo
@ RaduRădeanu sim, você está absolutamente correto, ele funcionará para alguns componentes internos.
souravc 28/03
3

Essa solução funciona perfeitamente bem, mas também é uma piada, porque a primeira coisa que pensei ao ler sua pergunta foi 'Quem ainda literalmente usa o homem a partir da linha de comando? Todo mundo não apenas pesquisa no Google a página de manual que deseja (para obter coisas sofisticadas, como rolagem ilimitada)? '. Então percebi que os sites que eu Google geralmente têm ambos os tipos de comandos; por que não usá-los apenas para fornecer uma interface uniforme da página de manual em todos os comandos. Por isso, essa diversão nasceu.

Isso requer uma conexão com a Internet para todas as entradas que você ainda não procurou pelo menos uma vez. Ele também precisa desses dois aplicativos pequenos que estão faltando em uma instalação padrão do Ubuntu:

 sudo apt-get install tidy html2text

Estes não são absolutamente necessários, mas ajudam a torná-lo um pouco melhor. O Tidy limpará o HTML e o html2text formatará esse html como texto formatado (o que geralmente é bastante trivial, pois a maioria desses sites já está formatada em texto e apenas envolta em tags <pre>.

Agora tudo que você precisa fazer é adicionar isso ao 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
}

Após o logout e o login novamente, você poderá digitar o seguinte:

iman cd

e exibirá a página de manual para cd.

Isso usa um diretório de dados (/ usr / share / iman) para minimizar nossos requisitos de rede (assim funcionará para entradas que você já encontrou antes mesmo sem a conexão; também para minimizar a carga neste site aleatório de páginas de manual do linux Encontrei com as entradas do sistema que também queremos). Se você não usar mais isso, remova-o para recuperar o espaço em disco.

Felizmente, o resto é bastante direto.

krowe
fonte
6
"Quem ainda literalmente usa o homem a partir da linha de comando?" Eu! e todos os outros que tem que visitar um datacenter (sem internet;))
Rinzwind
Aponte o ponto, isso não ajudará você a ficar claro.
krowe
6
Eu acho que o contrário, eu raramente uso o Google para procurar comandos bash. É muito mais rápido digitar "man command" sem precisar sair do teclado.
precisa
O comando alt + tab -> alt + d -> fará o mesmo sem o mouse e sem cancelar o comando cli atual, com rolagem e um milhão de outras coisas legais que o navegador oferece. Tenho certeza que você não saberia nada sobre isso porque seu sempre usar este site e outros como ele de lince ... FFS
krowe
No caso de builtins, sua imanfunção retorna a mesma saída que man bash-builtins.
Radu Rădeanu 26/03