Lange Manpages lesen und durchsuchen


32

Ich habe endlich satt zu wollen , wenn etwa lesen bash ‚s readund die -sOption mit man bash. Ich habe irgendwann den richtigen Platz gefunden (um die Linie 4500), aber es war wie immer frustrierend, da beide /readund sogar /\s-s\sSuchanfragen viel zu viele Übereinstimmungen haben.

Die Frage ist also: Wie kann ich lange Manpages effizient lesen oder lokal auf andere Weise dieselben Informationen abrufen ? Wie kann man als konkretes Beispiel die relevante Dokumentation erreichen, nachdem man sie read -s pwdin einem Shell-Skript gesehen hat? Eine gute Antwort könnte ein Shell-Skript-Snippet oder ein Hinweis auf ein Tool und dessen Verwendung sein, oder etwas ganz anderes, sofern dies dazu beiträgt, die richtige Stelle zum Lesen zu finden.

Hinweis: Ich bin nicht mit weil ich möchte, dass die Frage das Lesen von Manpages im Allgemeinen betrifft, auch wenn dies möglicherweise die am häufigsten anzutreffende humongous Manpage ist.


Ich stelle dies nicht als Antwort dar, da es möglicherweise nicht Ihren Anforderungen entspricht, aber: Wenn ich eine lange manSeite lesen muss, verwende ich ein kleines Skript, das ich in meinem oberen Bereich belasse. yuugian.com/demo/gkman.txt Teilen und genießen
Yuugian

Ich stelle dies auch nicht als Antwort dar;), weil es in der Tat um sich bashselbst geht: Genau wie Sie brauche auch ich meistens den SHELL BUILTINSTeil des Handbuchs, der sich in etwa in Zeile 3500 befindet . Wenn ich das wüsste, würde ich das nächste Mal einfach sagen man bashund dann um 66 Prozent nach unten gehen, indem ich tippe66% , dann ein paar Mal PgDn und ich bin da. Obwohl ich 66 gewählt habe, weil es als "Route 66" gespeichert werden kann , ist es tatsächlich ein bisschen mehr als das, obwohl es nicht so einfach zu speichern ist, es sei denn, es ist der Anfang Ihrer Telefonnummer usw. :) Zumindest die "Route 66" "ist universell und weltweit bekannt.
Syntaxfehler

Antworten:


33

Um schnell Hilfe zu einem Bash-Build zu erhalten, verwenden Sie help:

help read

ist was du willst.

Verwenden Sie für manpage-ähnliche Formatierungen

help -m read

oder noch besser

help -m read | less

Wenn Sie immer noch darauf bestehen, in der Manpage danach zu suchen, finde ich, was mich schnell zur Erklärung eines Befehls bringt

/^\s*read [[]

Dies funktioniert, da bei der ersten Erläuterung eines Befehls sein Name vom Zeilenanfang an leicht eingerückt wird. In diesem speziellen Fall readdauert es ein wenig, bis Sie zur eigentlichen readDokumentation gelangen, da das Wort "read" (aus offensichtlichen Gründen) in der gesamten Manpage häufig wiederholt wird. Das [[] bedeutet, ein [zu suchen, das normalerweise optionalen Parametern vorausgeht. (Ich lasse normalerweise / ^ \ s * aus und mache einfach / <eingebauter Befehl> [[])

Eine andere Alternative

Wenn Ihnen die Formatänderung nichts ausmacht, können Sie Ihre Manpage in eine DVI- oder PDF-Datei konvertieren:

man -T dvi bash >bash.dvi

oder

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

Selbstverständlich können Sie bei einem DVI- oder PDF-Dokument problemlos eine Textsuche durchführen.


Hmm, das helpist großartig, ich frage mich, wie ich noch nie davon gehört habe ... ps2pdfist nicht so nützlich, da es (anscheinend) keinerlei Index erzeugen kann.
Hyde

@hyde Du bist dir nicht sicher, was du mit dem Erstellen eines Index meinst, aber hast du schon von ptx gehört ?
Joseph R.

Index oder Inhaltsverzeichnis, dass "ptx" genau so klingt, wie ich es gemeint habe.
Hyde

1
Eine andere, noch einfachere Alternative ist 'man bash> bashman.txt'. Dann können Sie die Datei bashman.txt einfach in einem (anderen) Fenster Ihres Texteditors öffnen und alle darin enthaltenen Befehle verwenden, um das Gewünschte zu finden. Sie können die Datei sogar bearbeiten, um Tags für die Abschnitte hinzuzufügen, auf die Sie sich am häufigsten beziehen. Es hilft, bashman.txt schreibgeschützt zu machen, damit Sie es nicht versehentlich in Ihrem Editor ändern.
Joe

Sie können Manpages auch in einem Browser Ihrer Wahl öffnen und alle zugehörigen Tools verwenden. Siehe askubuntu.com/questions/339255/…
Joe,

9

Ansatz 1

man bashdann /read \[dann/-s

Ansatz 2

Sie können ein Open-Source-Tool zum Erläutern von Befehlszeilenargumenten mit dem Namen explainhell ausprobieren .

Es kann lokal verwendet werden. Lesen Sie die Dokumentation unter https://github.com/idank/explainshell

Vorsichtsmaßnahmen: Funktioniert normalerweise, aber nur mit Befehlen, die im Manpage-Repository von Ubuntu enthalten sind

In Ihrem Fall kann es das -sEinschalten nicht erkennen read -s pwd.

Ansatz 3

Ich habe ein anderes Tool gefunden, das vielversprechend erscheint, aber auf meinem System nicht funktioniert.

Erklären Sie: Kurze Dokumentation für Unix-Befehle


Mit Ansatz 1 können Sie /-s\bTreffer wie vermeiden --some-other-command(während Sie weiterhin Zeichenfolgen wie finden -s,, die Sie nicht erhalten würden, wenn Sie /-smit einem Leerzeichen suchen ).
David Knipe

8

Was ich in diesem Fall normalerweise mache, ist einfach auszuführen man, nach der SHELL BUILTIN COMMANDSÜberschrift zu suchen und dann nach der eingebauten zu suchen, d. H

man bash
/^SHELL BUILTIN
/  read 

In Bash können Sie jedoch tun

help read

oder, je nach System, eines von

man 1 read
man bash-builtins

Im Allgemeinen habe ich ein Skript namens he("kurze Hilfe"), um dies zu tun. Sie würden es so ausführen:

he bash read

Zu Ihrer Information, ich umbenannt descin he. github.com/mikelward/scripts/blob/master/he
Mikel

3

Es gibt keinen generischen Weg, um Informationen in einer Manpage zu finden, ebenso wenig wie es einen generischen Weg gibt, um Informationen in einem Buch zu finden. Es kommt darauf an, wonach Sie suchen.

Wenn Sie nach Informationen zu einer eingebauten Shell suchen, können Sie am Anfang einer Zeile nach der eingebauten suchen, wobei der Einzug und ein Leerzeichen folgen müssen: Suchen nach ^ *read␣(z. B. Typ /^ *read␣ Enter) ( ist ein Leerzeichen). Dies funktioniert mit dash, pdksh, mksh und bash. Die Manpage von Zsh ist aufgeteilt, sodass Sie die zshbuiltinsManpage lesen müssen . Ksh93 hat spezielle Symbole vor den Namen einiger eingebauter Elemente, nach denen Sie ^ *†*␣in UTF-8 oder ^ *-*␣in ASCII suchen müssen . Es gibt ein paar Fehlalarme, die Sie jedoch schnell zur richtigen Linie bringen. Durch die Suche nach ^ *read($| [-[])wird die Anzahl der Fehlalarme verringert.

Sie können die Suche beschleunigen, indem Sie Ihrem Pager mitteilen, wohin Sie möchten. Öffnet beispielsweise PAGER='less "+/^ *read \["' man bashdie Bash-Manpage zur Beschreibung des readeingebauten Moduls. Sie können dies zu einer Funktion machen:

man-builtin () {
  PAGER="less '+/^ *$1(\$|\\[|-)'" man ${SHELL##*/}
}

In der mkshManpage / read (zwei Leerzeichen, Befehlsname, ein Leerzeichen) wird normalerweise die richtige Stelle gefunden (dies ist ein Trick, den ich selbst verwende und den ich schnell eingebe). Danke, dass Sie danach gefragt haben. Ich werde (etwas) separate Referenzen für alle in mksh enthaltenen Dienstprogramme auf meinem TODO setzen.
Mirabilos

1
@mirabilos / read neigt zu vielen Fehlalarmen, wenn die Implementierung Ihres Mannes den Text rechtfertigt.
Gilles 'SO- hör auf böse zu sein'

Einverstanden. Noch mehr Grund, die eingebaute Dokumentation wirklich abzuspalten.
Mirabilos

1

Um direkt zum Abschnitt SHELL BUILTINS COMMANDS der Bash-Manpage zu springen, definiere ich den folgenden Alias ​​in meiner $HOME/.bash_aliasesDatei.

alias man-builtin="man -P 'less -p ^SHELL\ BUILTIN\ COMMANDS' bash"

0

Um eine weitere Alternative anzubieten: Wenn Sie einen Webbrowser bevorzugen, mit dem Sie die aktuelle Seite leicht durchsuchen können, können Sie so etwas wie man.cgi von freeBSD.org verwenden, mit dem Sie auch Manpages von verschiedenen Systemen anzeigen können, um zu sehen, wie Sie unterscheiden sich. Ich habe ähnliche auf anderen Websites gesehen. Erwarten Sie also, dass es andere Variationen gibt.

Der Hilfelink unter apropos bietet einige Informationen, um eine Kopie des Skripts mit Links zum Herunterladen der Manpage-Sammlungen auf Ihren eigenen Server zu stellen.


0

Ich bin herumgekommen, um eine Bash-Funktion für diesen Zweck zu erstellen. Dieses Snippet kann zum Beispiel am Ende von eingefügt werden ~/.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
  )
}

Kommentare erklären ein wenig, was es tut. Die Standardsuchzeichenfolge sucht insbesondere nach einem bestimmten Wort ab dem Zeilenanfang und überspringt dabei den Anfangsraum. Beispiele:

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

Hinweis: Dieses Skript hat kein Konzept für Manpage-Abschnitte ... Ich werde sehen, ob ich das später optimieren kann, aber das Festlegen der MANSECTUmgebungsvariablen von man hilft.


2
Möglicherweise möchten Sie einen Trap hinzufügen, um die temporäre Datei zu bereinigen:trap 'rm -f "$tmp"'
l0b0

1
Das sieht sehr kompliziert aus. Ich habe nicht vollständig gelesen, was Ihr Skript tut, aber würde man "$1" | vim -R - "+/$2"etwas Ähnliches nicht tun?
Gilles 'SO- hör auf böse zu sein'

@Gilles das würde ich zum ersten mal machen $2, also nein.
Hyde

@ l0b0 Die zu verwendende Bereinigung wurde geändert trap. Ich habe jedoch keine saubere Möglichkeit gefunden, dies in einer Funktion zu tun, ohne eine Subshell zu erstellen.
Hyde

@hyde Passen Sie den regulären Ausdruck natürlich an Ihre Arbeitsweise an. Mein Punkt war die Verwendung von+/REGEX
Gilles 'SO - hör auf, böse zu sein'

0

Wenn Sie die Teile aus der anderen Diskussion hier zusammenstellen , können Sie eine schnelle Funktion in Ihrem übernehmen .bashrc, mit der Sie direkt zum eingebauten Gerät (falls vorhanden) gelangen. Ansonsten öffnet es sich manwie gewohnt:

man() {
    case "$(/bin/bash -c 'type -t '"$1")" in 
        builtin)
            LESS=+?"^       $1 " command -p man bash
            ;;
        *)
            command -p man $@
            ;;
    esac
}

0

In jeder Linux-Distribution sollten Sie die Möglichkeit info bashhaben, separate Absätze nach Aktionstyp zu erstellen, bei denen die Informationen mit den Manpages identisch sind.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.