Warum sind die Abschnittstitel von Manpages nicht vollständig lesbar?

Dies wurde in El Capitan und in High Sierra eines Kollegen im Standard-Terminal (bash) getestet.

user@hostname ~ $ man ls | grep "BU"
BUGS
user@hostname ~ $ man ls | grep "BUG"
user@hostname ~ $ 
user@hostname ~ $ man ls | grep "IEEE"
     files in order to be compatible with the IEEE Std 1003.2 (``POSIX.2'')
     The ls utility conforms to IEEE Std 1003.1-2001 (``POSIX.1'').

Zur Verdeutlichung: "BUGS" ist ein Abschnittstitel in dieser (und verschiedenen anderen) Manpages. Bei Abschnittstiteln scheint Grepping nur für die ersten 2 Zeichen zu funktionieren; Dies ist bei einigen verschiedenen Abschnittstiteln, die wir ausprobiert haben, konsistent. Der Rest des Inhalts grepscheint wie erwartet zu funktionieren.

Ich habe ssh in eine nicht-BSD-ähnliche Linux-Box (Amazon Linux) und es scheint nicht das gleiche Verhalten zu zeigen.

Was ist hier los?

Das ist einer der Gründe, warum ich BSD-Mann hasse. Es formatiert den Text und führt den Pager aus, selbst wenn seine Ausgabe eine Pipe ist. Und mein Pager ist vim, also bewahre Linus, dass ich es jemals getan habe man foo | grep bar, ich bekomme eine nicht reagierende Pipeline (und vielleicht ein durcheinandergebrachtes Terminal zum Booten). :/ mandb man , was Sie normalerweise unter Linux sehen, ist vernünftiger.
unix.stackexchange.com/questions/371062 ist auch eine MacOS-Frage.

Antworten (1)

Sie können sehen, was passiert, wenn Sie die Rohcodes in einer Manpage anzeigen. Eine Möglichkeit, dies zu tun, besteht darin, die Manpage in eine Datei zu exportieren und ihren Inhalt direkt zu überprüfen:

man ls > man.ls
nano man.ls

Das Wort "BUGS" sieht in der Datei tatsächlich so aus:

B^HBU^HUG^HGS^HS

Sie werden sehen, dass die Kopfzeilen Formatierungszeichen enthalten, sodass das gesamte Wort „BUGS“ nicht vorhanden ist.


Wenn Sie auf den Klartextinhalt der Handbuchseite zugreifen möchten, können Sie den Befehl verwenden

man -P cat <thepage>

Die -POption setzt den Pager auf ein anderes Unix und catignoriert die Formatierungsinformationen und gibt eine Klartextausgabe aus. Dies scheint jedoch unter macOS nicht zu funktionieren, sodass die Ausgabe einen manuellen col -bSchritt in der Pipeline erfordert:

man ls | col -b | grep BUGS
Danke Schott! Das Umleiten zu einer Datei und das Öffnen in einem Texteditor hätte das erste sein sollen, was ich versucht habe. Mit diesen Informationen und den Informationen von unix.stackexchange.com/a/15866 (dh man ls | col -b | grep "BUGS") konnte ich bekommen, was ich wollte.
Heilige Moly, das Fette ist die alte TTY- und Schreibmaschinenära, tippe einen Buchstaben und die Rücktaste und tippe den Buchstaben erneut, in dem Wissen, dass sie nicht perfekt ausgerichtet sind und mehr Tinte ablagern werden. Es muss einen nroffBefehl geben, um das zu übersetzen, wenn Sie es brauchen grep- hätten Sie etwas dagegen, wenn ich dies um die Übergabe des richtigen Befehls an groffvia erweitern würde man?
@Kroltan +10 und +10 auch ins Schottische. Das ist viel eleganter, als dass ich nicht daran gedacht hätte, diese bestimmte Katze zu häuten.
@Kroltan Hmmm - für mich man -P cat ls | grep BUGSfunktioniert es identisch mit man ls | grep BUGS, beide geben nichts zurück.
@Kroltan Der Pager ist nicht der Teil, den Sie austauschen müssen - er befasst sich nur damit, wenn die Ausgabe nicht auf den Bildschirm passt, also kommt, nachdem troff/ groff/ nroffdie Ausgabe formatiert hat. Es reicht auch nicht aus, die Backspace-Zeichen zu entfernen (Sie erhalten "BBUUGGSS"), Sie müssen den Formatierer davon überzeugen, sie gar nicht erst zu generieren.
Ein Tipp auf man manschlägt vor, die Ausgabe col -bdurchzuleiten, um die Backspaces intelligent zu entfernen, und man ls | col -b | grep BUGSfunktioniert tatsächlich auf meinem (CentOS Linux) System. Nicht sicher, ob dieser Befehl unter MacOS verfügbar ist.
Warum nicht im Standard-Pager suchen man -P "less -p BUGS" ls?
@IMSoP hmm, dann müssen es Systemunterschiede sein, ich habe es in Arch getestet und das Suchen nach BUGS hat funktioniert. Mein Fehler.
Für manuelle Systeme, die GNU roff verwenden, gibt es tatsächlich Optionen, die verhindern, grottydass entweder TTY-37- oder ECMA48-Steuersequenzen ausgegeben werden.