Czy `man ls> temp.txt`. Wyjściowy plik tekstowy jest uszkodzony

27

Po uruchomieniu man ls > temp.txtwyjściowy plik tekstowy jest uszkodzony. Przez zepsuty rozumiem, że pierwsze i ostatnie litery w niektórych słowach są nadmiernie powtarzane.

Kilka pierwszych wierszy w temp.txt:

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

NNAAMMEE
     llss -- list directory contents

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

DDEESSCCRRIIPPTTIIOONN

I tak dalej. Bez przekierowania man lsjest to całkowicie normalne. Co się dzieje?

seeker_of_bacon
źródło
Co ciekawe, przeglądanie pliku przy użyciu lesslub moreprawidłowe formatowanie. Jeśli użyjesz vim, wyświetli nieprzetworzone spacje ( ^H) z dodatkowymi literami.
Kelvin
2
Twoje pliki cierpią na czkawkę.
Cthulhu
Co ciekawe, polecenie man na moim komputerze z systemem Linux nie zachowuje się w ten sposób, gdy dane wyjściowe są przekierowywane.
David Bailey,

Odpowiedzi:

30

Od man man:

Aby uzyskać zwykłą wersję tekstową strony podręcznika, bez spacji i znaków podkreślenia, spróbuj

    # man foo | col -b > foo.mantxt

manwypisuje sformatowaną wersję strony man, podkreślenia i podwójne litery są parsowane

Nie tyle są one „analizowane”, co raczej „jeśli nie masz terminala, pogrubiony format powinien być wyświetlany jako powtarzający się znak”. Po podłączeniu go do terminala (vt100, xterm, Terminal itp.), Człowiek rozpoznaje terminal i wysyła odpowiednie kody sterujące, aby zrobić kolor, pogrubienie, podkreślenie i tym podobne. Jest poprawnie analizowany - tylko dla typu terminala zerowego.

komentarz Michaela T.

Mateusz Szlosek
źródło
21

Dawno, dawno temu komputery były rutynowo łączone z teletypami (teleprinters), które drukowały cały tekst na papierze w czasie rzeczywistym po jego otrzymaniu. Chociaż teleprinterzy nie mieli żadnych ułatwień dla tekstu podkreślonego lub pogrubionego, wydrukowanie podkreślenia, odstępów i wydrukowanie czegoś innego spowodowałoby, że coś innego wyglądałoby na podkreślone. Podobnie generowanie znaku, cofanie i wyświetlanie tego samego znaku powodowałyby, że postać wydawałaby się ciemniejsza, chociaż jej skuteczność byłaby różna w zależności od jakości zainstalowanej wstążki (jeśli wstążka była stara i słaba, dwukrotnie wpisz ten sam znak sprawiłoby, że byłby znacznie ciemniejszy; dzięki nowej wstążce, która napisałaby postać, nawet jeden raz osiągnąłby prawie maksymalną czerń). Co więcej, nawet jeśli użytkownik nie był podłączony do drukarki,mando bufora wydruku byłby dość powszechny, co prawdopodobnie wyjaśnia, dlaczego manzachowuje się w ten sposób, nawet gdy wyjście zostanie przekierowane.

BTW, na niektórych drukarkach (a nawet teleprinterach), wydajność _←U_←N_←D_←E_←R_←L_←I_←N_←I_←N_←Gbyłaby zauważalnie gorsza niż ___________←←←←←←←←←←←UNDERLINING, ponieważ ta pierwsza wymaga, aby głowica drukująca wielokrotnie odwracała kierunek (i zwykle przekraczała swój cel na obu końcach). To samo byłoby prawdą również w przypadku korzystania z pogrubionej wielowarstwowej pogrubienia, ale w tym przypadku zachowanie może być korzystne, ponieważ przy pierwszym drukowaniu każdego znaku następuje natychmiast po znaku cofania, a drugi nie. Gdyby głowica drukująca przyspieszyła podczas drukowania pierwszego znaku, spowodowałoby to nieznaczne przesunięcie względem drugiego znaku, dzięki czemu efekt pogrubionej twarzy byłby bardziej skuteczny.

supercat
źródło
Im więcej dowiaduję się o Uniksie, tym bardziej odkrywam, że jest on obciążony kompatybilnością wsteczną, podobnie jak Windows.
Siyuan Ren,
Czysta lekcja historii! Wspaniale jest zobaczyć, dlaczego niektóre metody mogą być preferowane nad innymi.
Dustin Wheeler
15

Odpowiedź Mateusza jest poprawna, ale warto zaznaczyć, że zamiast usuwania formatowania przeznaczonego dla tty, możesz mieć inny format man.

Na przykład możesz uzyskać ładnie sformatowany plik pdf za pomocą:

man -t ls | pstopdf -i -o ~/ls.pdf
Tim B.
źródło
Używam OnyX od lat głównie do drukowania moich stron podręcznika w ten sposób. Już nie! Napiszę to w skrypcie, który wykona wszystkie strony podręcznika systemowego w moim systemie. Wielkie dzięki za to, że już dawno przestałem szukać jakiegokolwiek powodu, dla którego korzystam z OnyX. Wolę robić takie rzeczy z terminalu, a teraz mogę.
user3439894,
Fajna funkcja. Czy poza tym istnieje prosty sposób na wyświetlenie html? gzip -dc $(man -w ls) | groff -Thtml -mandoc -c > /tmp/man-ls.html
Kelvin
Strona man dla man mówi, że -tformaty groff -Tps ...zi do ciągów znaków na / usr / bin / man, które wydają się być zakodowane na stałe. A ponieważ -Tpszastępuje GROFF_TYPESETTER, Twoje rozwiązanie może być najbardziej opłacalne. Chociaż brakuje ci kroku w rurociągu. Chcesz tbl, a następnie groff. Spróbuj man -d lszobaczyć potok, którego używa.
Tim B
6

Alternatywnie mam zdefiniowaną następującą funkcję powłoki (wywoływaną z wtyczki OS X Oh-my-ZSH ):

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

Powoduje to, że pożądana strona podręcznika jest otwierana w podglądzie z całym ładnym formatowaniem, jakiego można sobie życzyć. Łatwo jest dodać ten pojedynczy alias do twojego ~/.profile(myślę, że pmanjest łatwiej niż man-preview, więc ustawiłem alias pman='man-previewmój ~/.zshrc).

PS Widziałem pmanfunkcję zdefiniowaną w różnych plikach kropek w Internecie, Oh-my-ZSH akurat tam, gdzie jest moja.

Dustin Wheeler
źródło
2

Możesz też użyć ManOpen by Carl Lindberg, aby wyszukać i wydrukować dowolną stronę podręcznika. ManOpen został opracowany dla NeXtStep i nadal działa dzięki Carlowi.

Sunwolf
źródło