Jak sprawić, by `man` działał dla wbudowanych poleceń i słów kluczowych powłoki?

56

Korzystam z manpolecenia przez cały czas, gdy chcę uzyskać informacje o konkretnym poleceniu. Ale to nie pomaga mi zbytnio, gdy to konkretne polecenie jest wbudowane w powłokę. Na przykład:

man cd

zwroty:

No manual entry for cd

Moje pytanie brzmi: jest to możliwe, aby manrównież działać dla wszystkich wbudowanych poleceń powłoki (jak cd, alias, history, itd.), Jak i słowa kluczowe ( if, while, [[, {, itd.)?

Radu Rădeanu
źródło
A dlaczego echojest wbudowane polecenie, ale ma stronę podręcznika?
Parto
5
@ AvatarParto echoto także polecenie systemowe (wykonywalne) znajdujące się w /bin. Możesz to sprawdzić za pomocą type -a echo. To samo dzieje się z, timea może i innymi.
Radu Rădeanu
Czy już odkryłeś info bash?
bbaassssiiee
Zawsze możesz pisać własne strony podręcznika man.
Elliott Frisch

Odpowiedzi:

66

helpKomenda gdy jest używany z -mopcją może wyświetlać informacje o wbudowanych poleceń w formacie pseudo-podręcznika systemowego. Na przykład:

help -m cd | less

wyświetli informacje o cdpoleceniu w formacie prawie dokładnie takim, jak na stronie podręcznika.

Zaczynając od tego polecenia, możesz zawinąć manpolecenie w jedną funkcję w swoim .bashrcpliku w następujący sposób:

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

Po tym manbędzie działać również dla wszystkich poleceń i słów kluczowych wbudowanych w powłokę. Na przykład:

man :

wyświetli się:

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
źródło
Bardzo sprytne podejście! +1
phatskat
5
Jeśli istnieją pliki wykonywalne maskowane przez wbudowane funkcje, możesz określić sekcję. man timevs.man 1 time
Stop Harming Monica
1
... zauważ jednak, że jeśli jesteś zshużytkownikiem, nie masz tyle szczęścia: bugs.launchpad.net/ubuntu/+source/zsh/+bug/1242108 (nie ma zainstalowanych stron podręcznika man)
Rmano
info, help -mdlaczego nie możemy obecnie mieć dobrych stron podręcznika? W każdym razie dzięki!
Tor Klingberg
+1 ... fajnie! Zachowanie funkcji yr przypomina nieco to, co dzieje się w wyniku przeciążenia funkcji w C / C ++ ... Tylko, co ciekawe man type, nie tworzy opisu opcji „-a” lub „-t” w Ubuntu 14.04.4 .... a jednak 'są tam !
Cbhihe
28
man bash-builtins

Zawiera fragmenty pomocy dla wbudowanych poleceń, aczkolwiek w nieco bardziej skondensowanym formacie niż w helpekwiwalencie.

Oli
źródło
Dobrze wiedzieć! Pochodzi z sekcji 7 instrukcji. Do tej pory nie słyszałem o tej stronie podręcznika. +1, ale nie mogę zaakceptować tej odpowiedzi, ponieważ nie jest to dokładnie to, o co prosiłem.
Radu Rădeanu
Na MacOS High Sierra to polecenie jest po prostu „wbudowane w człowieka”
Tony Barganski
13

Możesz zainstalować strony podręcznika na temat korzystania z systemu POSIX do programowania, ponieważ:

sudo apt-get install manpages-posix-dev

Zapewni strony podręcznika dla wbudowanych powłok.

$ type cd
cd is a shell builtin

Spróbuj teraz,

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

NAME
   cd - change the working directory

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


...
souravc
źródło
3
Czekałem, aż ktoś przyjdzie z tą odpowiedzią. Problem polega jednak na tym, że zadziała to tylko w przypadku niektórych wbudowanych - określonych przez POSIX .
Radu Rădeanu
3
Bash nie stosuje się ściśle do POSIX, chyba że działa w trybie POSIX, więc te strony podręcznika mogą nie być wyczerpujące i mogą być błędne w pewnych okolicznościach, szczególnie przy opisie zachowania niektórych funkcji.
Chris Down,
@ RaduRădeanu tak, masz absolutną rację, będzie działać dla niektórych wbudowanych.
souravc
3

To rozwiązanie działa doskonale, ale jest też trochę żartem, ponieważ pierwszą rzeczą, o której pomyślałem, kiedy przeczytałem twoje pytanie, było: „Kto nadal dosłownie używa człowieka z linii poleceń? Czyż nie wszyscy tylko Google szukają strony podręcznika użytkownika (aby uzyskać wymyślne rzeczy, takie jak nieograniczone przewijanie)? ”. Potem zdałem sobie sprawę, że strony, które zazwyczaj używam w Google, mają oba typy poleceń, więc dlaczego nie użyć ich do zapewnienia jednolitego interfejsu strony podręcznika dla wszystkich poleceń. Tak narodziła się ta zabawa.

Wymaga to połączenia z Internetem dla wszystkich wpisów, których nie sprawdziłeś przynajmniej raz. Potrzebuje również tych dwóch małych aplikacji, których brakuje w domyślnej instalacji Ubuntu:

 sudo apt-get install tidy html2text

Nie są one absolutnie potrzebne, ale pomagają sprawić, by wyglądał trochę ładniej. Tidy wyczyści HTML, a html2text sformatuje ten HTML jako sformatowany tekst (co zwykle jest dość trywialne, ponieważ większość z tych stron jest już sformatowana i po prostu owinięta tagami <pre>.

Teraz wszystko, co musisz zrobić, to dodać to na końcu ~/.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
}

Po wylogowaniu i ponownym zalogowaniu powinieneś móc wpisać:

iman cd

i wyświetli stronę man dla cd.

Korzysta z katalogu danych (/ usr / share / iman), aby zminimalizować nasze wymagania sieciowe (dzięki czemu będzie działał dla wpisów, które już znalazłeś, nawet bez połączenia; również w celu zminimalizowania obciążenia tej strony losowych stron linuksa Znalazłem też wpisy systemowe, które chcemy w nim znaleźć). Jeśli nie będziesz go więcej używać, będziesz chciał go usunąć, aby odzyskać miejsce na dysku.

Mamy nadzieję, że reszta jest całkiem prosta.

krowe
źródło
6
„Kto wciąż dosłownie używa człowieka z linii poleceń?” Ja! i wszyscy inni, którzy muszą odwiedzić centrum danych (brak internetu;))
Rinzwind
Przyjmując punkt, to nie pomoże ci to wyjaśnić.
krowe
6
Myślę, że przeciwnik, rzadko używam Google do wyszukiwania poleceń bash. O wiele szybsze jest pisanie „man command” bez konieczności opuszczania klawiatury.
laurent
Polecenie alt + tab -> alt + d -> zrobi to samo bez myszy i bez anulowania bieżącego polecenia cli oraz z przewijaniem i milionem innych fajnych rzeczy, które daje przeglądarka. Jestem pewien, że nic byś o tym nie wiedział, ponieważ zawsze korzystasz z tej strony, a inni podobają się z niej rysie ... ffs
krowe
W przypadku wbudowanych imanfunkcji funkcja zwraca to samo wyjście co man bash-builtins.
Radu Rădeanu