Die hilfreiche Antwort von rici erklärt das Problem mit dem ursprünglichen Ansatz gut.
Es gibt jedoch noch etwas Erwähnenswertes:
man
Die Ausgabe von enthält Formatierungssteuerzeichen , die die Textsuche beeinträchtigen .
Wenn Sie an col -b
leiten vor der Suche , werden diese Steuerzeichen entfernt - beachten Sie den Nebeneffekt, dass die Suchergebnisse auch im Klartext vorliegen.
Jedoch grep
ist nicht das richtige Werkzeug für diesen Job; Ich schlage vor, awk
zu verwenden wie folgt, um die Beschreibung von -O
zu erhalten :
man gcc | col -b | awk -v RS= '/^\s+-O\n/'
RS=
(ein leeres Eingabedatensatz-Trennzeichen) ist ein awk-Idiom, das die Eingabe in Blöcke von nicht leeren Zeilen aufteilt, sodass der Abgleich der Option am Anfang eines solchen Blocks sicherstellt, dass alle Zeilen, die die Beschreibung der Option enthalten zurückgegeben werden.
Wenn Sie nur POSIX-Features haben awk
wie BSD/OSX awk
, verwenden Sie diese Version:
man gcc | col -b | awk -v RS= '/^[[:blank:]]+-O\n/'
Offensichtlich ist die Eingabe eines solchen Befehls etwas umständlich, also finden Sie generic bash
Funktion manopt
unten, die die Beschreibung der angegebenen Option für den angegebenen Befehl aus seinem man
zurückgibt Seite . (Es kann falsch positive und negative Ergebnisse geben, aber insgesamt funktioniert es ziemlich gut.)
Beispiele:
manopt gcc O # search `man gcc` for description of `-O`
manopt grep regexp # search `man grep` for description of `--regexp`
manopt find '-exec.*' # search `man find` for all actions _starting with_ '-exec'
bash
Funktion manopt()
- in ~/.bashrc
platzieren , zum Beispiel:
# SYNOPSIS
# manopt command opt
#
# DESCRIPTION
# Returns the portion of COMMAND's man page describing option OPT.
# Note: Result is plain text - formatting is lost.
#
# OPT may be a short option (e.g., -F) or long option (e.g., --fixed-strings);
# specifying the preceding '-' or '--' is OPTIONAL - UNLESS with long option
# names preceded only by *1* '-', such as the actions for the `find` command.
#
# Matching is exact by default; to turn on prefix matching for long options,
# quote the prefix and append '.*', e.g.: `manopt find '-exec.*'` finds
# both '-exec' and 'execdir'.
#
# EXAMPLES
# manopt ls l # same as: manopt ls -l
# manopt sort reverse # same as: manopt sort --reverse
# manopt find -print # MUST prefix with '-' here.
# manopt find '-exec.*' # find options *starting* with '-exec'
manopt() {
local cmd=$1 opt=$2
[[ $opt == -* ]] || { (( ${#opt} == 1 )) && opt="-$opt" || opt="--$opt"; }
man "$cmd" | col -b | awk -v opt="$opt" -v RS= '$0 ~ "(^|,)[[:blank:]]+" opt "([[:punct:][:space:]]|$)"'
}
fish
Implementierung von manopt()
:
Beigesteuert von Ivan Aracki.
function manopt
set -l cmd $argv[1]
set -l opt $argv[2]
if not echo $opt | grep '^-' >/dev/null
if [ (string length $opt) = 1 ]
set opt "-$opt"
else
set opt "--$opt"
end
end
man "$cmd" | col -b | awk -v opt="$opt" -v RS= '$0 ~ "(^|,)[[:blank:]]+" opt "([[:punct:][:space:]]|$)"'
end
Ich vermute, Sie haben grep $'-O\n'
nicht wirklich verwendet , sondern ein Flag, das von grep
erkannt wird .
Aus Sicht von grep übergeben Sie einfach ein Argument, und dieses Argument beginnt mit einem -
also wird es als Option interpretiert. Sie müssen so etwas wie grep -- -O$
tun um das Ende der Optionsliste explizit zu kennzeichnen, oder grep -e -O$
um das Muster explizit als Muster zu kennzeichnen. Auf jeden Fall können Sie keinen Zeilenumbruch in ein Muster einfügen, da grep-Muster eigentlich Listen von Mustern sind, die durch Zeilenumbruchzeichen getrennt sind, also das Argument $'foo\n'
ist eigentlich zwei Muster, foo
und die leere Zeichenfolge, und die leere Zeichenfolge passt zu jeder Zeile.
Vielleicht haben Sie nach dem Flag -e
gesucht da dies ein Muster als Argument nimmt, und wenn Sie ihm einen Zeilenumbruch als Argument geben, wird grep jede Zeile in der gesamten Datei finden.
Für die meisten GNU-Programme, wie z. B. gcc, finden Sie möglicherweise den info
Benutzeroberfläche einfacher zu navigieren, da sie Referenzlinks, Inhaltsverzeichnisse und sogar Indizes enthält. Der info gcc
Das Dokument enthält einen Index der Optionen, was sehr nützlich ist. In einigen Linux-Distributionen, und etwas überraschend, da sie sich GNU/Linux-Distributionen nennen, ist es notwendig, info
separat zu installieren Pakete obwohl man
Dateien werden mit der Basissoftware verteilt. Das debian/ubuntu-Paket, das den gcc info
enthält Dateien heißt gcc-doc
, zum Beispiel. (Die Verwendung des -doc
Suffix zum Paketnamen ist durchaus üblich.)
Im Fall von gcc
Sie können eine Option schnell finden, indem Sie einen Befehl wie diesen verwenden:
info gcc "option index" O
oder
info gcc --index-search=funroll-loops
Für Programme mit weniger Optionen reicht es normalerweise aus, -O
von info zu verwenden Möglichkeit:
info -O gawk