ไม่ใช่ `man ls> temp.txt` ไฟล์ข้อความเอาต์พุตเสียหาย


27

เมื่อฉันรันman ls > temp.txtไฟล์ข้อความเอาต์พุตเสียหาย จากความเสียหายฉันหมายถึงว่าตัวอักษรตัวแรกและตัวสุดท้ายในบางคำพูดซ้ำมากเกินไป

หลายบรรทัดแรกในtemp.txt:

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

NNAAMMEE
     llss -- list directory contents

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

DDEESSCCRRIIPPTTIIOONN

และอื่น ๆ ไม่มีการเปลี่ยนเส้นทางman lsเป็นเรื่องปกติอย่างสมบูรณ์ เกิดอะไรขึ้น?


น่าสนใจให้ดูไฟล์โดยใช้lessหรือmoreแสดงการจัดรูปแบบอย่างถูกต้อง ถ้าคุณใช้vimมันจะแสดง backspaces แบบดิบ ( ^H) พร้อมตัวอักษรพิเศษ
เคลวิน

2
ไฟล์ของคุณมีอาการสะอึก
คธูลู

น่าสนใจคำสั่ง man บนคอมพิวเตอร์ Linux ของฉันไม่ทำงานเช่นนี้เมื่อมีการเปลี่ยนเส้นทางผลลัพธ์
David Bailey

คำตอบ:


30

จากman man:

หากต้องการรับ man page เวอร์ชันข้อความธรรมดาโดยไม่มี backspaces และ underscores ให้ลอง

    # man foo | col -b > foo.mantxt

manพิมพ์รุ่นที่จัดรูปแบบของหน้าคนขีดล่างและตัวอักษรคู่จะถูกแยกวิเคราะห์

มันไม่มากที่พวกเขาจะแยกวิเคราะห์ แต่ค่อนข้าง "ถ้าคุณไม่มีขั้วรูปแบบตัวหนาจะถูกแสดงเป็นตัวละครซ้ำ" เมื่อคุณเชื่อมต่อกับเทอร์มินัล (vt100, xterm, เทอร์มินัล ฯลฯ ... ) มนุษย์จะจดจำเทอร์มินัลและส่งรหัสควบคุมที่เหมาะสมในการทำสีตัวหนาขีดเส้นใต้และอื่น ๆ มันถูกแยกวิเคราะห์อย่างถูกต้อง - เพียงสำหรับชนิดขั้วนัล

แสดงความคิดเห็นโดย MichaelT


21

กาลครั้งหนึ่งนาน ๆ ครั้งคอมพิวเตอร์ถูกเชื่อมต่อกับเครื่องโทรพิมพ์ (teleprinters) เป็นประจำซึ่งจะพิมพ์ข้อความทั้งหมดลงบนกระดาษตามเวลาจริงตามที่ได้รับ แม้ว่าเครื่องพิมพ์ดีดไม่ได้มีสิ่งอำนวยความสะดวกใด ๆ สำหรับข้อความที่ขีดเส้นใต้หรือตัวหนา แต่การขีดเส้นใต้เอาท์แบ็กสเปซและการพิมพ์อย่างอื่นจะทำให้สิ่งอื่นปรากฏขึ้น ในทำนองเดียวกันการส่งออกอักขระ backspacing และการส่งออกอักขระเดียวกันมีแนวโน้มที่จะทำให้ตัวละครดูเข้มขึ้นแม้ว่าประสิทธิภาพของสิ่งนั้นจะแตกต่างกันไปขึ้นอยู่กับคุณภาพของริบบิ้นที่ติดตั้ง (ถ้าริบบิ้นเก่าและอ่อนแอพิมพ์ตัวอักษรเดียวกันสองครั้ง จะทำให้มันมืดลงอย่างมีนัยสำคัญด้วยริบบิ้นใหม่ที่พิมพ์อักขระแม้ครั้งเดียวจะบรรลุความดำสนิทสูงสุด) เพิ่มเติมแม้ว่าผู้ใช้จะไม่ได้เชื่อมต่อกับเครื่องพิมพ์manไปยังตัวจัดคิวงานพิมพ์เป็นเรื่องธรรมดาซึ่งอาจอธิบายได้ว่าทำไมmanจะทำเช่นนั้นแม้ว่าจะเปลี่ยนเส้นทางเอาท์พุท

BTW สำหรับเครื่องพิมพ์บางรุ่น (และแม้กระทั่งเครื่องพิมพ์ทางไกล) ประสิทธิภาพการทำงาน_←U_←N_←D_←E_←R_←L_←I_←N_←I_←N_←Gจะแย่ลงอย่างเห็นได้ชัด___________←←←←←←←←←←←UNDERLININGเนื่องจากเครื่องพิมพ์รุ่นเก่าต้องใช้หัวพิมพ์เพื่อกลับทิศทางซ้ำ ๆ กัน (และมักจะเกินเป้าหมายที่ปลายทั้งสอง) เช่นเดียวกันจะเป็นจริงเมื่อใช้ตัวหนาแบบมัลติสไตรค์เช่นกัน แต่มีพฤติกรรมที่เป็นประโยชน์จริง ๆ ตั้งแต่ครั้งแรกที่ตัวละครแต่ละตัวถูกพิมพ์จะตามตัวอักษร backspace ทันทีและตัวที่สองจะไม่ หากหัวพิมพ์เร่งในขณะที่พิมพ์ตัวอักษรตัวแรกนั่นจะทำให้เกิดการวางแนวที่ไม่ตรงกับที่สองเล็กน้อยทำให้เอฟเฟ็กต์ใบหน้าที่มีประสิทธิภาพยิ่งขึ้น


ยิ่งฉันเรียนรู้เกี่ยวกับ Unix มากเท่าไหร่ฉันก็ยิ่งพบว่ามันถูกห่อหุ้มด้วยความเข้ากันได้แบบย้อนหลังเช่นเดียวกับ Windows
Siyuan Ren

บทเรียนประวัติศาสตร์เรียบร้อย! ดีมากที่ได้เห็นว่าทำไมจึงเลือกวิธีการบางอย่างมากกว่าวิธีอื่น
Dustin Wheeler

15

คำตอบของ Mateusz นั้นถูกต้อง แต่มันก็คุ้มค่าที่จะชี้ให้เห็นว่าแทนที่จะใช้การจัดรูปแบบที่มีไว้สำหรับ tty คุณสามารถมีรูปแบบของมนุษย์ต่างกัน

ตัวอย่างเช่นคุณสามารถรับรูปแบบ PDF ที่ดีแทนด้วย:

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

ตอนนี้ฉันใช้OnyXมาหลายปีแล้วเพื่อพิมพ์หน้าคนของฉันแบบนี้ ไม่อีกแล้ว! ฉันจะเขียนสิ่งนี้ลงในสคริปต์ที่จะทำ man page ทั้งหมดในระบบของฉัน ขอบคุณมากสำหรับสิ่งนี้เพราะฉันเลิกมองไปนานมาแล้วว่าทำไมฉันถึงใช้ OnyX ฉันชอบทำสิ่งนี้จากเทอร์มินัลและตอนนี้ฉันสามารถทำได้
user3439894

คุณสมบัติที่ดี มีวิธีง่าย ๆ ในการแสดงผล html นอกเหนือจากนี้หรือไม่ gzip -dc $(man -w ls) | groff -Thtml -mandoc -c > /tmp/man-ls.html
เคลวิน

manpage สำหรับ man บอกว่า-tรูปแบบที่มีgroff -Tps ...และจากการรันสตริงบน / usr / bin / man ที่ดูเหมือนจะเป็นฮาร์ดโค้ด และเนื่องจาก-Tpsแทนที่ GROFF_TYPESETTER โซลูชันของคุณอาจทำงานได้ดีที่สุด แม้ว่าคุณจะพลาดขั้นตอนในการส่งข้อมูล คุณต้องการ tbl แล้ว Groff ลองman -d lsดูท่อที่ใช้
ทิม B

6

เป็นทางเลือกฉันได้กำหนดฟังก์ชันเชลล์ต่อไปนี้ (เรียกจากปลั๊กอิน OS X ของ Oh-my-ZSH ):

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

ผลลัพธ์นี้ในหน้า man ที่ต้องการจะถูกเปิดใน Preview พร้อมกับการจัดรูปแบบที่สวยงามที่คุณต้องการ มันง่ายพอที่จะเพิ่มชื่อแทนเดียวนี้ให้กับคุณ~/.profile(ฉันคิดว่าpmanง่ายกว่าman-previewดังนั้นฉันจึงตั้งค่าไว้alias pman='man-previewใน~/.zshrc)

ป.ล. ฉันได้เห็นpmanฟังก์ชั่นที่กำหนดไว้ในไฟล์ dot ต่างๆรอบ ๆ อินเทอร์เน็ตแล้ว Oh-my-ZSH เพิ่งเกิดขึ้นตรงจุดที่กำหนดไว้


2

หรือคุณสามารถใช้ ManOpen โดย Carl Lindberg เพื่อค้นหาและพิมพ์หน้าใดก็ได้ ManOpen ได้รับการพัฒนาครั้งแรกสำหรับ NeXtStep และยังคงใช้งานได้ดีกับ Carl

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.