Ich habe komisches Verhalten, wenn ich versuche, eine Manpage unter macOS zu lesen. In der Bash-Manpage kommt beispielsweise eindeutig die Zeichenfolge vor NAME
:
$ man bash | head -5 | tail -1
NAME
Und wenn ich greife name
, bekomme ich Ergebnisse, aber wenn ich greife, NAME
tue ich das nicht:
$ man bash | grep 'NAME'
$ man bash | grep NAME
Ich habe andere Großbuchstaben ausprobiert, von denen ich weiß, dass sie vorhanden sind, und habe nach Ergebnissen SHELL
nichts gesucht, wohingegen nach BASH
Ergebnissen gesucht wurde .
Was ist hier los?
Update : Danke für alle Antworten! Ich dachte, es lohnt sich, den Kontext hinzuzufügen, in dem ich darauf gestoßen bin. Ich wollte eine Bash-Funktion zum man
Umbrechen schreiben und in Fällen, in denen ich versucht habe, die Manpage nach einer eingebauten Shell zu durchsuchen, zum entsprechenden Abschnitt der Bash-Manpage springen. Es könnte einen besseren Weg geben, aber hier ist, was ich aktuell habe:
man () {
case "$(type -t "$1")" in
builtin)
local pattern="^ *$1"
if bashdoc_match "$pattern \+[-[]"; then
command man bash | less --pattern="$pattern +[-[]"
elif bashdoc_match "$pattern\b"; then
command man bash | less --pattern="$pattern[[:>:]]"
else
command man bash
fi
;;
keyword)
command man bash | less --hilite-search --pattern='^SHELL GRAMMAR$'
;;
*)
command man "$@"
;;
esac
}
bashdoc_match() {
command man bash | col -b | grep -l "$1" > /dev/null
}
quelle
man bash | grep NAME
funktioniert wie erwartet.help
Befehl bash verwenden , um dessen Informationen abzurufen .help
Ergebnisse zu viel auslassen . Schauen Sie sich zum Beispielhelp complete
dencomplete
Abschnitt anman bash
.Antworten:
Wenn Sie
| sed -n l
diesemtail
Befehl ein hinzufügen , um nicht druckbare Zeichen anzuzeigen, wird wahrscheinlich Folgendes angezeigt:Das heißt, jedes Zeichen wird als
X
Rücktaste geschriebenX
. Auf modernen Terminals wird das Zeichen ohne Unterschied über sich selbst geschrieben (da Backspace aka BS aka\b
aka^H
das Zeichen ist, das den Cursor eine Spalte nach links bewegt). Aber in alten Teleschreibmaschinen würde dies dazu führen, dass das Zeichen fett dargestellt wird, da es doppelt so viel Tinte erhält.Trotzdem verstehen Pager wie
more
/less
, dass dieses Format fett bedeutet, und das ist es auch, wasroff
zur Ausgabe von fettem Text verwendet wird.Einige Implementierungen rufen
roff
diese Sequenzen so auf, dass sie nicht verwendet werden (oder rufencol -b -p -x
sie intern auf, um sie wie im Fall derman-db
Implementierung zu entfernen (es sei denn, dieMAN_KEEP_FORMATTING
Umgebungsvariable ist festgelegt)), und rufen keinen Pager auf, wenn sie die Ausgabe erkennen Ich gehe nicht zu einem Terminal (man bash | grep NAME
würde dort also funktionieren), aber nicht zu deinem.Sie können
col -b
diese Sequenzen entfernen (es gibt auch andere Typen (_
BSX
) zum Unterstreichen).Bei Systemen, die GNU verwenden
roff
(wie GNU oder FreeBSD), können Sie verhindern, dass diese Sequenzen an erster Stelle verwendet werden, indem Sie sicherstellen, dass die-c -b -u
Optionen an übergeben werdengrotty
, beispielsweise indem Sie sicherstellen, dass die-P-cbu
Optionen an übergeben werdengroff
.Zum Beispiel durch Erstellen eines Wrapper-Skripts mit dem Namen „
groff
Enthält:Das hast du vor / usr / bin / groff gesetzt
$PATH
.Mit macOS '
man
(auch mit GNUroff
) können Sie einman-no-overstrike.conf
mit:Und ruf an
man
als:roff
Wenn Sie bei GNU dieGROFF_SGR
Umgebungsvariable festlegen (oder dieGROFF_NO_SGR
Variable nicht festlegen , je nachdem, wie die Standardeinstellungen zum Zeitpunkt der Kompilierung festgelegt wurden), werden stattdessengrotty
(sofern diese-c
Option nicht übergeben wird ) Escape-Sequenzen für ANSI SGR-Terminals verwendet dieser BS-Tricks für Zeichenattribute.less
Verstehe sie, wenn sie mit der-R
Option aufgerufen werden .Der Benutzer von FreeBSD ruft
grotty
mit der-c
Option auf, es sei denn, Sie fordern Farben an, indem Sie die Variable MANCOLOR setzen (in diesem Fall-c
wird die Verwendung von ANSI SGR-Escape-Sequenzen dort nicht übernommengrotty
undgrotty
auf die Standardeinstellung zurückgesetzt).wird dort arbeiten.
Unter Debian ist GROFF_SGR nicht die Standardeinstellung. Wenn Sie tun:
Da es sich
man
bei stdout jedoch nicht um ein Terminal handelt, muss auch eineGROFF_NO_SGR
Variable an übergeben werdengrotty
(ich nehme an, damit könnencol -bpx
die BS-Sequenzen entfernt werden, dacol
nicht bekannt ist, wie die SGR-Sequenzen entfernt werden, obwohl dies immer noch der Fall ist tut es mitMAN_KEEP_FORMATTING
) was unser überschreibtGROFF_SGR
. Sie können stattdessen Folgendes tun:(in einem Terminal), um die SGR-Escape-Sequenzen zu erhalten.
Dieses Mal werden Sie feststellen, dass einige dieser NAMEN auf dem Terminal (und in einem
less -R
Pager) fett gedruckt sind. Wenn Sie die Ausgabe ansed -n l
(MANPAGER='sed -n /NAME/l'
) weiterleiten, wird Folgendes angezeigt:Wo
\e[1m
ist die Reihenfolge, in der in ANSI-kompatiblen Terminals Fettdruck aktiviert werden soll, und\e[0m
die Reihenfolge, in der alle SGR-Attribute auf die Standardwerte zurückgesetzt werden sollen?Dieser Text
grep NAME
funktioniert so wie der Text enthältNAME
, aber Sie könnten trotzdem Probleme haben, wenn Sie nach Text suchen, bei dem nur Teile davon fett / unterstrichen sind ...quelle
sed -n l
als Ersatz fürod
.Wenn Sie sich eine Handbuchseite ansehen, werden Sie feststellen, dass die Überschriften fett gedruckt sind. Dies wird erreicht, indem sie mit Steuerzeichen formatiert werden. Um
grep
Ihren Wünschen entsprechen zu können, müssen diese entfernt werden.Das
col
Dienstprogramm kann dazu verwendet werden:Die
-b
Option hat die folgende Beschreibung unter OpenBSD :Das Linux-
col
Handbuch (unter Ubuntu) enthält nicht den letzten Satz (aber es funktioniert genauso).Unter Linux
MAN_KEEP_FORMATTING
kann es auch hilfreich sein, die Umgebungsvariable zu deaktivieren (oder auf eine leere Zeichenfolge zu setzen), und Siegrep
können dies tun , ohne die Ausgabe vonman
through zu übergebencol -b
.quelle
NAME
in der Bash-Anleitung nurNAME
nein\b
.MAN_KEEP_FORMATTING
Variable genau so funktioniert, wie Sie es sagen. Ich wollte nur darauf hinweisen, dass dies nicht immer der Fall ist.