Czytanie i przeszukiwanie długich stron podręcznika

32

I w końcu dość, gdy chcemy czytać o bash „ów readi jest to -sopcja z man bash. W końcu znalazłem właściwe miejsce (około linii 4500), ale jak zwykle frustrujące, ponieważ zarówno wyszukiwania , jak /readi /\s-s\swyszukiwania mają zbyt wiele dopasowań.

Pytanie brzmi: w jaki sposób mogę efektywnie czytać długie strony podręcznika lub uzyskiwać te same informacje na inne sposoby, lokalnie ? Jako konkretny przykład, jak dotrzeć do odpowiedniej dokumentacji po obejrzeniu read -s pwdw skrypcie powłoki? Dobrą odpowiedzią może być fragment skryptu powłoki lub wskazówka na temat jakiegoś narzędzia i sposobu jego użycia lub czegoś zupełnie innego, o ile pomaga w znalezieniu odpowiedniego miejsca do czytania.

Uwaga: nie otagowałem ponieważ chcę, aby pytanie dotyczyło ogólnie czytania strony podręcznika, mimo że całkiem możliwe, że jest to najczęściej spotykana obszerna strona podręcznika.

hyde
źródło
Nie stawiam tego jako odpowiedzi, ponieważ może to być poza twoimi wymaganiami, ale: kiedy muszę przeczytać długą manstronę, używam małego skryptu, zostawiam na górnym panelu. yuugian.com/demo/gkman.txt Udostępnij i ciesz się
Yuugian
Nie umieszczam tego również jako odpowiedzi;), ponieważ to rzeczywiście dotyczy bashsamego siebie: tak jak ty, ja również najbardziej potrzebuję tej SHELL BUILTINSczęści instrukcji, która ma około linii 3500 . Więc wiedząc o tym, następnym razem po prostu powiem, man basha potem zejdę o 66 procent, pisząc 66%, a potem kilka razy PgDn i już tam jestem. Chociaż wybrałem 66, ponieważ można ją zapamiętać jako „Route 66” , w rzeczywistości jest to coś więcej, choć nie jest tak łatwe do zapamiętania, chyba że jest to początek numeru telefonu itp. :) Przynajmniej „Route 66” „jest uniwersalny i znany na całym świecie.
składnia błąd

Odpowiedzi:

33

Aby szybko uzyskać pomoc dotyczącą wbudowanego Bash, użyj help:

help read

jest tym, czego chcesz.

Aby uzyskać formatowanie przypominające stronę podręcznika, użyj

help -m read

lub nawet lepiej

help -m read | less

Jeśli nadal upierasz się, aby poszukać go na stronie podręcznika, znajdę to, co szybko prowadzi mnie do wyjaśnienia polecenia

/^\s*read [[]

Działa to, ponieważ po pierwszym wyjaśnieniu polecenia jego nazwa jest nieco wcięta od początku wiersza. W konkretnym przypadku readprzeglądanie zajmuje trochę czasu, zanim przejdziesz do faktycznegoread dokumentacji ponieważ (z oczywistych powodów) słowo „czytaj” jest często powtarzane na całej stronie podręcznika. [[] Oznacza dopasowanie do [, który zwykle poprzedza parametry opcjonalne. (Zwykle pomijam / ^ \ s * i po prostu robię / <wbudowane polecenie> [[])

Kolejna alternatywa

Jeśli nie przeszkadza ci zmiana formatu, możesz przekonwertować swoją stronę podręcznika na plik DVI lub PDF:

man -T dvi bash >bash.dvi

lub

man -T ps bash | ps2pdf - bash.pdf # Requires the Ghostscript suite for ps2pdf

Oczywiście, biorąc pod uwagę dokument DVI lub PDF, możesz łatwo wyszukiwać tekst.

Joseph R.
źródło
Hmm, helpto świetnie, zastanawiam się, jak nigdy o tym nie słyszałem ... ps2pdfnie jest to przydatne, ponieważ nie może (najwyraźniej) stworzyć żadnego rodzaju indeksu.
hyde
@hyde Nie wiesz, co masz na myśli, tworząc indeks, ale czy słyszałeś o ptx ?
Joseph R.
Indeks lub spis treści, że „ptx” brzmi dokładnie tak, jak miałem na myśli.
hyde
1
Inną, jeszcze prostszą alternatywą jest wykonanie „man bash> bashman.txt”. Następnie możesz po prostu otworzyć bashman.txt w (innym) oknie edytora tekstu i użyć wszystkich jego poleceń, aby znaleźć to, czego chcesz. Możesz nawet edytować plik, aby dodać tagi do najczęściej używanych sekcji. Ustawienie bashman.txt w trybie tylko do odczytu pomaga uniknąć przypadkowego modyfikowania go w edytorze.
Joe
Możesz także otwierać strony podręcznika w wybranej przeglądarce i korzystać ze wszystkich jej narzędzi. Zobacz askubuntu.com/questions/339255/…
Joe
9

Podejście 1

man bashnastępnie /read \[następnie/-s

Podejście 2

Możesz wypróbować narzędzie typu open source do wyjaśniania argumentów wiersza poleceń o nazwie wyjaśnia shell .

Można go używać lokalnie. Przeczytaj dokumentację na https://github.com/idank/explainshell

Ostrzeżenia: Zwykle działa, ale tylko z poleceniami znajdującymi się w repozytorium strony podręcznika Ubuntu

W twoim przypadku nie można rozpoznać -sprzełączenia read -s pwd.

Podejście 3

Znalazłem inne narzędzie, które wydaje się obiecujące, ale nie działa w moim systemie.

wyjaśnić: Krótka dokumentacja dla poleceń Uniksa

Ivan Chau
źródło
Dzięki podejściu 1 możesz /-s\buniknąć trafień takich jak --some-other-command(wciąż szukając takich ciągów znaków -s,, których nie uzyskałbyś, gdybyś szukał /-sspacji).
David Knipe,
8

To, co zwykle robię w tym przypadku, to po prostu uruchomić man, wyszukać SHELL BUILTIN COMMANDSnagłówek, a następnie wyszukać wbudowane, tj

man bash
/^SHELL BUILTIN
/  read 

jednak w bash możesz to zrobić

help read

lub, w zależności od systemu, albo

man 1 read
man bash-builtins

Ogólnie mam do tego skrypt o nazwie he(„krótka pomoc”). Uruchomiłbyś to w ten sposób:

he bash read
Mikel
źródło
FYI, zmieniłem nazwę descna he. github.com/mikelward/scripts/blob/master/he
Mikel
3

Nie ma ogólnego sposobu wyszukiwania informacji na stronie podręcznika, podobnie jak ogólny sposób wyszukiwania informacji w książce. To zależy od tego, czego szukasz.

Gdy szukasz informacji na temat wbudowanej powłoki, możesz wyszukać wbudowaną wersję na początku linii, aby zapisać wcięcia, a następnie spację: wyszukaj ^ *read␣(np. Typ /^ *read␣ Enter) ( jest spacją). Działa to z dash, pdksh, mksh i bash. Strona podręcznika Zsh jest podzielona, ​​więc musisz przeczytać zshbuiltinsstronę podręcznika . Ksh93 ma specjalne symbole przed nazwami niektórych wbudowań, których należy szukać ^ *†*␣w UTF-8 lub ^ *-*␣w ASCII. Istnieje kilka fałszywych wyników pozytywnych, ale szybko dojdziesz do właściwej linii. Wyszukiwanie ^ *read($| [-[])zmniejsza liczbę fałszywych trafień.

Możesz przyspieszyć wyszukiwanie, informując pager, gdzie chcesz się udać. Na przykład PAGER='less "+/^ *read \["' man bashotwiera stronę podręcznika bash w opisie readwbudowanego. Możesz ustawić tę funkcję:

man-builtin () {
  PAGER="less '+/^ *$1(\$|\\[|-)'" man ${SHELL##*/}
}
Gilles „SO- przestań być zły”
źródło
Na stronie mkshpodręcznej / read (dwie spacje, nazwa polecenia, jedna spacja) zwykle znajdują odpowiednie miejsce (jest to sztuczka, której sam używam i którą szybko piszę). Dziękuję za pytanie; Umieszczę (nieco) osobne odniesienia dla wszystkich narzędzi zawartych w mksh na moim TODO.
mirabilos
1
@mirabilos / read ma wiele fałszywych trafień, gdy implementacja man uzasadnia tekst.
Gilles „SO- przestań być zły”
Zgoda. Jeszcze więcej powodów, by naprawdę oddzielić wbudowaną dokumentację.
mirabilos
1

Aby przejść bezpośrednio do sekcji POLECENIA WBUDOWANYCH STRON na stronie podręcznika bash, definiuję w moim $HOME/.bash_aliasespliku następujący alias .

alias man-builtin="man -P 'less -p ^SHELL\ BUILTIN\ COMMANDS' bash"
krata
źródło
0

Aby zaoferować inną alternatywę, jeśli wolisz korzystać z przeglądarki internetowej, która pozwala łatwo przeszukiwać bieżącą stronę, możesz użyć czegoś takiego man.cgi używany na freeBSD.org, który pozwala również przeglądać strony man z różnych systemów, aby zobaczyć, jak Różnią się. Widziałem podobne na innych stronach, więc spodziewaj się, że istnieją inne odmiany.

Link pomocy pod apropos zawiera informacje na temat kopiowania skryptu do umieszczenia na własnym serwerze z linkami do pobierania kolekcji stron podręcznika.

sambler
źródło
0

Zacząłem tworzyć funkcję bash do tego celu. Ten fragment kodu można na przykład wkleić na końcu ~/.bashrc:

manfind() {
  # required args
  test "$1" -a "$2" || return 1                  

  # create temp file and get its name
  local tmp=$(mktemp /tmp/manfindXXXXXX) || return 1
  ( # subshell for trap
    trap "rm $tmp" EXIT

    # grep all matching lines with line numbers and pipe them to dialog
    if man "$1" |                   # get the whole man page
      grep -n "^\s*$2" |            # grep for the search string, with line nums
      sed 's/:/\n/' |               # replace line num separator with newline for dialog
      cut -c-70  |                  # cut long lines to nice length
      xargs -d'\n' -n 999999 \
        dialog --output-fd 3 --menu "Select line to go to" 0 0 0 3>$tmp -- 1 '(start of man page)'
    then
      # selected line number is now in $tmp, get man page and
      # use vim in read only mode to view it at right line
      man "$1" | vim -R +"$(< $tmp)" -
    else
      # cancel selected from dialog
      exit 1
    fi
  )
}

Komentarze wyjaśniają trochę o tym, co robi. Domyślny ciąg wyszukiwania w szczególności wyszukuje dane słowo od początku wiersza, pomijając początkową spację. Przykłady:

# find every line which starts with 'read' followed by space
manfind bash 'read '
# research bash subshells
manfind bash '.*subshell'

Uwaga: w tym skrypcie nie ma pojęcia o sekcjach strony man ... Zobaczę, czy poprawię to później, ale ustawienie MANSECTzmiennej środowiskowej man pomaga.

hyde
źródło
2
Możesz dodać pułapkę, aby wyczyścić plik tymczasowy:trap 'rm -f "$tmp"'
l0b0 15.10.13
1
To wygląda na bardzo skomplikowane. Nie przeczytałem w pełni, co robi twój skrypt, ale nie man "$1" | vim -R - "+/$2"zrobiłbym czegoś podobnego?
Gilles „SO- przestań być zły”
@Gilles I, które poszłyby do pierwszego wystąpienia $2, więc nie.
hyde
@ l0b0 Zmieniono czyszczenie do użycia trap. Nie znalazłem jednak czystego sposobu na zrobienie tego w funkcji bez tworzenia podpowłoki.
hyde
@hyde Dostosuj wyrażenie regularne do tego, co robisz. Chodziło mi o użycie+/REGEX
Gilles 'SO - przestań być zły'
0

Zestawiając fragmenty z innej dyskusji tutaj, oto szybka funkcja, którą możesz zostawić w swoim, .bashrcktóra przeniesie cię bezpośrednio do wbudowanego (jeśli istnieje). W przeciwnym razie otwiera się mannormalnie:

man() {
    case "$(/bin/bash -c 'type -t '"$1")" in 
        builtin)
            LESS=+?"^       $1 " command -p man bash
            ;;
        *)
            command -p man $@
            ;;
    esac
}
Nik V.
źródło
0

Z dowolnej dystrybucji Linuksa powinieneś być w stanie użyć, info bashjeśli chcesz mieć osobne akapity według rodzaju akcji, w których informacje są identyczne jak strony podręcznika man.

admstg
źródło