Did "man ls> temp.txt`. Il file di testo di output è danneggiato


27

Quando eseguo man ls > temp.txtil file di testo di output è danneggiato. Per corrotto intendo che la prima e l'ultima lettera in alcune parole sono eccessivamente ripetute.

Diverse prime righe in temp.txt:

LS(1)                     BSD General Commands Manual                    LS(1)

NNAAMMEE
     llss -- list directory contents

SSYYNNOOPPSSIISS
     llss [--AABBCCFFGGHHLLOOPPRRSSTTUUWW@@aabbccddeeffgghhiikkllmmnnooppqqrrssttuuwwxx11] [_f_i_l_e _._._.]

DDEESSCCRRIIPPTTIIOONN

E così via. Senza reindirizzamento man lsè perfettamente normale. Cosa sta succedendo?


È interessante notare che visualizzare il file utilizzando lesso morevisualizza correttamente la formattazione. Se lo usi vim, mostrerà i backspaces grezzi ( ^H) con le lettere extra.
Kelvin,

2
I tuoi file soffrono di singhiozzo.
Cthulhu,

Interessante, il comando man sul mio computer Linux non si comporta così quando l'output viene reindirizzato.
David Bailey,

Risposte:


30

Da man man:

Per ottenere una versione in testo normale di una pagina man, senza backspaces e underscore, prova

    # man foo | col -b > foo.mantxt

manstampa la versione formattata della pagina man, i caratteri di sottolineatura e le doppie lettere vengono analizzati

Non è tanto che vengono "analizzati", ma piuttosto "se non si dispone di un terminale, il formato in grassetto deve essere visualizzato come carattere ripetuto". Una volta collegato ad un terminale (vt100, xterm, Terminale, ecc ...), man riconosce il terminale e invia i codici di controllo appropriati per fare colore, grassetto, sottolineato e simili. Viene analizzato correttamente - solo per un tipo di terminale null.

commento di MichaelT


21

Una volta, i computer venivano sistematicamente collegati ai teletipi (teleprinter) che stampavano tutto il testo su carta in tempo reale quando veniva ricevuto. Sebbene le teleprinter non avessero alcuna possibilità per il testo sottolineato o in grassetto, la presentazione di una sottolineatura, il backspacing e la stampa di qualcos'altro avrebbe fatto apparire qualcos'altro sottolineato. Allo stesso modo, l'output di un personaggio, il backspacing e l'output dello stesso personaggio tenderebbe a far apparire il personaggio più scuro, sebbene l'efficacia di ciò varierebbe a seconda della qualità del nastro installato (se il nastro era vecchio e debole, digitando lo stesso carattere due volte lo renderebbe significativamente più scuro; con un nuovo nastro che digita il personaggio anche una volta otterrebbe quasi il massimo oscurità). Inoltre, anche se un utente non era collegato a una stampante,mana uno spooler di stampa sarebbe stato piuttosto comune, il che probabilmente spiega perché mansi comporterebbe in quel modo anche quando l'output viene reindirizzato.

A proposito, su alcune stampanti (e persino su teleprinter), le prestazioni di _←U_←N_←D_←E_←R_←L_←I_←N_←I_←N_←Gsarebbero notevolmente peggiori di ___________←←←←←←←←←←←UNDERLINING, poiché il primo richiede che la testina di stampa inverti ripetutamente la direzione (e in genere superi il suo obiettivo ad entrambe le estremità). Lo stesso sarebbe vero anche usando il grassetto multi-strike, ma lì il comportamento potrebbe effettivamente essere vantaggioso poiché la prima volta che ogni personaggio viene stampato seguirà immediatamente un carattere backspace e il secondo no. Se la testina di stampa accelerasse durante la stampa del primo carattere, ciò causerebbe un disallineamento leggermente rispetto al secondo, rendendo l'effetto grassetto più efficace.


Più imparo su Unix, più trovo che sia gravato da compatibilità con le versioni precedenti, proprio come Windows.
Siyuan Ren,

Lezione di storia ordinata! Fantastico vedere perché alcuni metodi potrebbero essere preferiti ad altri.
Dustin Wheeler,

15

La risposta di Mateusz è corretta, ma vale la pena sottolineare che invece di eliminare la formattazione destinata a un tty, puoi avere il formato man in modo diverso.

Ad esempio, puoi ottenere un pdf ben formattato invece con:

man -t ls | pstopdf -i -o ~/ls.pdf

Uso OnyX da anni, principalmente per stampare le mie pagine man in questo modo. Non piu! Scriverò questo in uno script che farà tutte le pagine man sul mio sistema. Grazie mille per questo dato che ho rinunciato a guardare molto tempo fa qualsiasi motivo per cui stavo usando OnyX. Preferisco di gran lunga fare cose del genere da un Terminale e ora posso.
user3439894,

Bella caratteristica. C'è un modo semplice per generare HTML oltre a questo? gzip -dc $(man -w ls) | groff -Thtml -mandoc -c > /tmp/man-ls.html
Kelvin,

La manpage per man dice che -tformatta con groff -Tps ...e da stringhe in esecuzione su / usr / bin / man, che sembra essere codificato. E poiché -Tpsignora GROFF_TYPESETTER, la tua soluzione potrebbe essere la più valida. Anche se ti manca un passaggio nella pipeline. Vuoi tbl poi groff. Prova man -d lsa vedere la pipeline che utilizza.
Tim B

6

In alternativa, ho definito la seguente funzione di shell (chiamata dal plugin OS X di Oh-my-ZSH ):

man-preview () {
    man -t "$@" | open -f -a /Applications/Preview.app
}

Ciò comporta l'apertura della pagina man desiderata in Anteprima con tutta la formattazione che si potrebbe desiderare. È abbastanza facile aggiungere questo singolo alias al tuo ~/.profile(penso che pmansia più facile di man-preview, quindi ho impostato alias pman='man-previewnel mio ~/.zshrc).

PS Ho visto la pmanfunzione definita in vari file di punti in Internet, Oh-my-ZSH sembra essere la mia.


2

Oppure puoi usare ManOpen di Carl Lindberg per cercare e stampare qualsiasi pagina man. ManOpen è stato sviluppato per la prima volta per NeXtStep e funziona ancora grazie a Carl.

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.