Perché i titoli delle sezioni delle pagine man non sono completamente visualizzabili?


14

Questo è stato testato a El Capitan e nell'Alta Sierra di un collega, nel Terminal standard (bash).

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'').

Per chiarire: "BUGS" è un titolo di sezione in quelle (e varie altre) manpage. Per i titoli delle sezioni, il grepping sembra funzionare solo per i primi 2 caratteri; questo è coerente con alcuni titoli di sezioni differenti che abbiamo provato. Per il resto del contenuto, grepsembra funzionare come previsto.

Ho usato una scatola Linux non aromatizzata BSD (Amazon Linux) e non sembra mostrare lo stesso comportamento.

Cosa sta succedendo qui?


Questo è parte del motivo per cui odio l'uomo BSD. Formatta il testo ed esegue il cercapersone anche quando il suo output è una pipe. E il mio cercapersone è VIM, quindi Linus non mi ha mai permesso man foo | grep bar, ho una pipeline non rispondente (e forse un terminale incasinato per l'avvio). : / mandb man , che è quello che vedi di solito su Linux, è più sensato.
muru,

unix.stackexchange.com/questions/371062 è anche una domanda MacOS.
JdeBP,

Risposte:


15

Puoi vedere cosa sta succedendo se visualizzi i codici grezzi all'interno di una pagina man. Un modo per farlo è esportare la pagina man in un file e controllarne direttamente il contenuto:

man ls > man.ls
nano man.ls

La parola "BUGS" in realtà assomiglia a questa nel file:

B^HBU^HUG^HGS^HS

Vedrai che le intestazioni contengono caratteri di formattazione, quindi l'intera parola "BUGS" non è presente.


Se si desidera accedere al contenuto in testo normale della pagina del manuale, è possibile utilizzare il comando

man -P cat <thepage>

L' -Popzione imposta il cercapersone su altri unix e catignorerà le informazioni di formattazione, fornendo un output in chiaro. Tuttavia, questo non sembra funzionare su macOS, quindi l'output richiede un col -bpassaggio manuale nella pipeline:

man ls | col -b | grep BUGS

2
Grazie Scot! Il reindirizzamento a un file e l'apertura in un editor di testo avrebbe dovuto essere la prima cosa che ho provato. Utilizzando tali informazioni e le informazioni di unix.stackexchange.com/a/15866 (ovvero man ls | col -b | grep "BUGS") sono stato in grado di ottenere ciò che volevo.
Jonathan Merklin,

7
Santo cielo, l'audace è la vecchia era della TTY e della macchina da scrivere, digita una lettera e un backspace e digita di nuovo la lettera, sapendo che non si allineano perfettamente e depositano più inchiostro. Ci deve essere un nroffcomando per tradurlo se necessario grep , ti dispiacerebbe se lo espandessi con come passare il comando corretto a groffvia man?
bmike

@Kroltan +10 e +10 anche per lo scot. È molto più elegante di come non stavo pensando di scuoiare questo particolare gatto.
bmike

@Kroltan Hmmm - per me, man -P cat ls | grep BUGSfunziona in modo identico man ls | grep BUGS, entrambi non restituiscono nulla.
Scot,

1
Per i sistemi manuali che utilizzano GNU roff, ci sono effettivamente opzioni grottyche impediranno che emetta sequenze di controllo TTY-37 o ECMA48.
JdeBP,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.