Será que `man ls> temp.txt`. O arquivo de texto de saída está corrompido

27

Quando executo man ls > temp.txto arquivo de texto de saída está corrompido. Por corrompido, quero dizer que a primeira e a última letra em algumas palavras são repetidas demais.

Várias primeiras linhas em 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 assim por diante. Sem redirecionamento man lsé perfeitamente normal. O que está acontecendo?

seeker_of_bacon
fonte
Curiosamente, visualizando o arquivo usando lessou moreexibe a formatação corretamente. Se você usar vim, ele mostrará os backspaces brutos ( ^H) com as letras extras.
Kelvin
2
Seus arquivos sofrem de soluços.
Cthulhu
Interessante, o comando man no meu computador Linux não se comporta assim quando a saída é redirecionada.
David Bailey

Respostas:

30

De man man:

Para obter uma versão em texto sem formatação de uma página de manual, sem backspaces e sublinhados, tente

    # man foo | col -b > foo.mantxt

manimprime a versão formatada da página de manual, sublinhados e letras duplas são analisados

Não é tanto que eles são 'analisados', mas sim "se você não possui um terminal, o formato em negrito deve ser exibido como um caractere repetido". Depois de conectá-lo a um terminal (vt100, xterm, Terminal, etc ...), o homem reconhece o terminal e envia os códigos de controle apropriados para cores, negrito, sublinhado e similares. Ele está sendo analisado corretamente - apenas para um tipo de terminal nulo.

comentário de MichaelT

Mateusz Szlosek
fonte
21

Antigamente, os computadores eram rotineiramente conectados a teletipos (tele-impressoras), que imprimiam todo o texto no papel em tempo real, à medida que ele era recebido. Embora as tele-impressoras não possuam instalações para texto sublinhado ou em negrito, imprimir um sublinhado, retroceder e imprimir outra coisa faria com que outra coisa aparecesse sublinhada. Da mesma forma, a saída de um caractere, o backspacing e o mesmo caractere tendem a torná-lo mais escuro, embora a eficácia disso varie dependendo da qualidade da faixa de opções instalada (se a faixa de opções for antiga e fraca, digitando o mesmo caractere duas vezes tornaria significativamente mais escuro; com uma nova fita digitando o personagem, mesmo que atingisse a escuridão máxima). Além disso, mesmo que um usuário não esteja conectado a uma impressora,manpara um spooler de impressão teria sido bastante comum, o que provavelmente explica por manque se comportaria dessa maneira mesmo quando a saída fosse redirecionada.

BTW, em algumas impressoras (e até mesmo em tele-impressoras), o desempenho de _←U_←N_←D_←E_←R_←L_←I_←N_←I_←N_←Gseria significativamente pior do que ___________←←←←←←←←←←←UNDERLINING, já que o primeiro exige que o cabeçote de impressão inverta repetidamente a direção (e normalmente ultrapassa seu objetivo nas duas extremidades). O mesmo seria verdade ao usar o negrito de múltiplos golpes também, mas o comportamento poderia ser realmente vantajoso, pois a primeira vez que cada caractere é impresso seguiria imediatamente um caractere de backspace e o segundo não. Se a cabeça de impressão estivesse acelerando ao imprimir o primeiro caractere, isso faria com que estivesse desalinhado levemente em relação ao segundo, tornando o efeito de negrito mais eficaz.

supercat
fonte
Quanto mais eu aprendo sobre o Unix, mais percebo como ele é sobrecarregado com a compatibilidade com versões anteriores, assim como o Windows.
Siyuan Ren
Pura lição de história! É ótimo ver por que certos métodos podem ser preferidos a outros.
Dustin Wheeler
15

A resposta de Mateusz está correta, mas vale ressaltar que, em vez de retirar a formatação destinada a um tty, você pode ter o formato man de maneira diferente.

Por exemplo, você pode obter um pdf bem formatado com:

man -t ls | pstopdf -i -o ~/ls.pdf
Tim B
fonte
Eu tenho usado o OnyX há anos, principalmente para obter minhas páginas de manual assim. Não mais! Vou escrever isso em um script que fará todas as páginas de manual do meu sistema. Muito obrigado por isso, porque desisti de procurar há muito tempo por que eu estava usando o OnyX. Eu prefiro fazer coisas assim a partir de um terminal e agora posso.
user3439894
Bom recurso. Existe uma maneira simples de gerar html além disso? gzip -dc $(man -w ls) | groff -Thtml -mandoc -c > /tmp/man-ls.html
Kelvin
A página de manual do man diz que -tformata com groff -Tps ...e de executar strings em / usr / bin / man, que parece estar codificado. E como -Tpssubstitui GROFF_TYPESETTER, sua solução pode ser a mais viável. Embora você esteja perdendo uma etapa em seu pipeline. Você quer tbl então groff. Tente man -d lsver o pipeline usado.
Tim B
6

Como alternativa, eu tenho a seguinte função shell definida (chamada do plug-in OS X de Oh-my-ZSH ):

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

Isso resulta na abertura da página de manual desejada na Visualização com toda a bonita formatação que se poderia desejar. É fácil o suficiente adicionar esse alias único ao seu ~/.profile(eu acho que pmané mais fácil do que man-preview, então configurei alias pman='man-previewno meu ~/.zshrc).

PS: Eu já vi a pmanfunção definida em vários arquivos de ponto na Internet; o Oh-my-ZSH é o local onde o meu está definido.

Dustin Wheeler
fonte
2

Ou você pode usar o ManOpen da Carl Lindberg para procurar e imprimir qualquer página de manual. O ManOpen foi desenvolvido pela primeira vez para o NeXtStep e ainda funciona graças a Carl.

Sunwolf
fonte