Est-ce que `man ls> temp.txt`. Le fichier texte de sortie est corrompu

27

Lorsque j'exécute, man ls > temp.txtle fichier texte de sortie est corrompu. Par corrompu, je veux dire que la première et la dernière lettre de certains mots sont trop répétées.

Plusieurs premières lignes dans temp.txt:

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

NNAAMMEE
     llss -- list directory contents

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

DDEESSCCRRIIPPTTIIOONN

Etc. Sans redirection, man lsc'est parfaitement normal. Que ce passe-t-il?

seeker_of_bacon
la source
Fait intéressant, l'affichage du fichier en utilisant lessou moreaffiche correctement la mise en forme. Si vous utilisez vim, il affichera les backspaces bruts ( ^H) avec les lettres supplémentaires.
Kelvin
2
Vos fichiers souffrent de hoquets.
Cthulhu
Intéressant, la commande man sur mon ordinateur Linux ne se comporte pas comme ça lorsque la sortie est redirigée.
David Bailey

Réponses:

30

De man man:

Pour obtenir une version en texte brut d'une page de manuel, sans espaces arrière ni traits de soulignement, essayez

    # man foo | col -b > foo.mantxt

manimprime la version formatée de la page de manuel, les traits de soulignement et les lettres doubles sont analysés

Ce n'est pas tant qu'ils sont "analysés" mais plutôt "si vous n'avez pas de terminal, le format gras doit être affiché comme un caractère répété". Une fois que vous le connectez à un terminal (vt100, xterm, Terminal, etc ...), l'homme reconnaît le terminal et envoie les codes de contrôle appropriés pour faire de la couleur, du gras, du soulignement, etc. Il est analysé correctement - juste pour un type de terminal nul.

commentaire de MichaelT

Mateusz Szlosek
la source
21

Il était une fois, des ordinateurs étaient régulièrement connectés à des télétypes (téléimprimeurs) qui imprimaient tout le texte sur papier en temps réel au fur et à mesure de sa réception. Bien que les téléimprimeurs ne disposaient d'aucune fonctionnalité pour le texte souligné ou en gras, la sortie d'un soulignement, d'un retour en arrière et de l'impression d'une autre chose ferait apparaître cette autre chose soulignée. De même, la sortie d'un caractère, le retour en arrière et la sortie du même caractère tendraient à rendre le caractère plus sombre, bien que l'efficacité de celui-ci varie en fonction de la qualité du ruban installé (si le ruban était ancien et faible, en tapant le même caractère deux fois le rendrait beaucoup plus sombre; avec un nouveau ruban tapant le caractère, même une seule fois atteindrait une noirceur maximale). De plus, même si un utilisateur n'était pas connecté à une imprimante,manà un spouleur d'impression aurait été assez courant, ce qui explique probablement pourquoi manse comporterait de cette façon même lorsque la sortie était redirigée.

BTW, sur certaines imprimantes (et même les téléimprimantes), les performances de _←U_←N_←D_←E_←R_←L_←I_←N_←I_←N_←Gseraient nettement pires que ___________←←←←←←←←←←←UNDERLINING, car la première nécessite que la tête d'impression inverse à plusieurs reprises la direction (et dépasse généralement sa cible aux deux extrémités). La même chose serait vraie lors de l'utilisation de caractères gras multi-frappes également, mais là, le comportement pourrait en fait être avantageux car la première fois que chaque caractère est imprimé suivrait immédiatement un caractère de retour arrière et le second ne le serait pas. Si la tête d'impression accélérait lors de l'impression du premier caractère, cela entraînerait un léger désalignement par rapport au second, ce qui rendrait l'effet de gras plus efficace.

supercat
la source
Plus j'en apprends sur Unix, plus je trouve comment il est encombré de rétrocompatibilité, tout comme Windows.
Siyuan Ren
Leçon d'histoire soignée! Idéal pour voir pourquoi certaines méthodes peuvent être préférées aux autres.
Dustin Wheeler du
15

La réponse de Mateusz est correcte, mais il convient de souligner qu'au lieu de supprimer le formatage destiné à un tty, vous pouvez avoir un formatage homme différemment.

Par exemple, vous pouvez obtenir un pdf bien formaté à la place avec:

man -t ls | pstopdf -i -o ~/ls.pdf
Tim B
la source
J'utilise OnyX depuis des années maintenant principalement pour imprimer mes pages de manuel comme cela. Pas plus! Je vais écrire ceci dans un script qui fera toutes les pages de manuel de mon système. Merci beaucoup pour cela car j'ai renoncé à chercher il y a longtemps pourquoi j'utilisais OnyX. Je préfère de loin faire des choses comme ça à partir d'un terminal et maintenant je peux.
user3439894
Belle fonctionnalité. Existe-t-il un moyen simple de sortir du HTML en plus de cela? gzip -dc $(man -w ls) | groff -Thtml -mandoc -c > /tmp/man-ls.html
Kelvin
La page de manuel de man indique que les -tformats avec groff -Tps ...et à partir de l'exécution de chaînes sur / usr / bin / man, semblent être codés en dur. Et comme elle -Tpsremplace GROFF_TYPESETTER, votre solution pourrait être la plus viable. Bien qu'il vous manque une étape dans votre pipeline. Vous voulez tbl puis groff. Essayez man -d lsde voir le pipeline qu'il utilise.
Tim B
6

Comme alternative, j'ai la fonction shell suivante définie (appelée depuis le plugin OS X d' Oh-my-ZSH ):

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

Il en résulte que la page de manuel souhaitée est ouverte dans Aperçu avec tout le joli formatage que l'on peut souhaiter. Il est assez facile d'ajouter ce seul alias à votre ~/.profile(je pense que pmanc'est plus facile que man-preview, donc je l'ai défini alias pman='man-previewdans mon ~/.zshrc).

PS J'ai vu la pmanfonction définie dans divers fichiers dot sur Internet, Oh-my-ZSH se trouve être là où la mienne est définie.

Dustin Wheeler
la source
2

Ou vous pouvez utiliser ManOpen by Carl Lindberg pour rechercher et imprimer n'importe quelle page de manuel. ManOpen a été développé pour la première fois pour NeXtStep et fonctionne toujours grâce à Carl.

Sunwolf
la source