ทำไมชื่อส่วนของหน้าคนจึงไม่สามารถใช้คำศัพท์ได้ทั้งหมด?


14

สิ่งนี้ถูกทดสอบใน El Capitan และใน High Sierra ของเพื่อนร่วมงานใน Terminal มาตรฐาน (ทุบตี)

user@hostname ~ $ man ls | grep "BU"
BUGS
user@hostname ~ $ man ls | grep "BUG"
user@hostname ~ $ 
user@hostname ~ $ man ls | grep "IEEE"
     files in order to be compatible with the IEEE Std 1003.2 (``POSIX.2'')
     The ls utility conforms to IEEE Std 1003.1-2001 (``POSIX.1'').

หากต้องการชี้แจง: "BUGS" เป็นชื่อส่วนใน manpages (และอื่น ๆ ) ที่หลากหลาย สำหรับชื่อส่วนการ grepping ดูเหมือนจะใช้ได้กับอักขระ 2 ตัวแรกเท่านั้น สิ่งนี้สอดคล้องกันในหลาย ๆ ส่วนที่เราได้ลอง สำหรับเนื้อหาที่เหลือgrepดูเหมือนว่าจะทำงานได้ตามที่คาดไว้

ฉันไปที่ลินุกซ์ที่ไม่มีกลิ่นรส (Amazon Linux) ที่ไม่ใช่ BSD และไม่ปรากฏว่ามีพฤติกรรมแบบเดียวกัน

เกิดอะไรขึ้นที่นี่?


นี่เป็นส่วนหนึ่งของเหตุผลที่ฉันเกลียดผู้ชาย BSD มันจัดรูปแบบข้อความและเรียกใช้เพจเจอร์แม้ว่าเอาต์พุตจะเป็นไพพ์ และวิทยุติดตามตัวของฉันเป็นกลุ่มดังนั้น Linus จึงห้ามไม่ให้ทำman foo | grep barฉันได้รับสายที่ไม่ตอบสนอง : / mandb man , ซึ่งเป็นสิ่งที่คุณเห็นบน Linux, มีเหตุผลมากขึ้น.
muru

unix.stackexchange.com/questions/371062ยังเป็นคำถามของ MacOS
JdeBP

คำตอบ:


15

คุณสามารถดูสิ่งที่เกิดขึ้นหากคุณดูรหัสดิบภายในหน้าคน วิธีหนึ่งในการทำเช่นนี้คือส่งออก man page ไปยังไฟล์และตรวจสอบเนื้อหาโดยตรง:

man ls > man.ls
nano man.ls

คำว่า "BUGS" มีลักษณะเช่นนี้ในไฟล์:

B^HBU^HUG^HGS^HS

คุณจะเห็นว่าส่วนหัวมีอักขระการจัดรูปแบบดังนั้นคำทั้งหมด "BUGS" จึงไม่ปรากฏ


หากคุณต้องการเข้าถึงเนื้อหาธรรมดาของหน้าคู่มือคุณสามารถใช้คำสั่ง

man -P cat <thepage>

-Pตัวเลือกชุดเพจเจอร์บน Unix อื่น ๆ และcatจะไม่สนใจการจัดรูปแบบข้อมูลให้ผลผลิต plaintext อย่างไรก็ตามสิ่งนี้ไม่ทำงานบน macOS ดังนั้นผลลัพธ์ต้องมีcol -bขั้นตอนแบบแมนนวลในไปป์ไลน์:

man ls | col -b | grep BUGS

2
ขอบคุณชาวสกอต! การเปลี่ยนเส้นทางไปยังไฟล์และการเปิดในโปรแกรมแก้ไขข้อความควรเป็นสิ่งแรกที่ฉันลอง การใช้ข้อมูลนั้นและข้อมูลจากunix.stackexchange.com/a/15866 (เช่นman ls | col -b | grep "BUGS") ฉันสามารถได้รับสิ่งที่ฉันต้องการ
Jonathan Merklin

7
Holy moly ตัวหนาเป็นยุค TTY และเครื่องพิมพ์ดีดพิมพ์ตัวอักษรและ backspace และพิมพ์ตัวอักษรอีกครั้งโดยที่รู้ว่าพวกเขาจะไม่เข้าแถวอย่างสมบูรณ์และจะฝากหมึกเพิ่ม จะต้องมีnroffคำสั่งให้แปลว่าถ้าคุณต้องการgrep - คุณจะรังเกียจไหมถ้าฉันขยายมันด้วยวิธีส่งคำสั่งที่ถูกต้องไปยังgroffผ่านman?
bmike

@ Kroltan +10 และ +10 เพื่อสก็อตเช่นกัน นั่นเป็นวิธีที่สง่างามกว่าที่ฉันไม่ได้คิดที่จะทำให้แมวตัวนี้น่าสนใจ
bmike

@ Kroltan Hmmm - สำหรับฉันman -P cat ls | grep BUGSทำงานเหมือนกันman ls | grep BUGSทั้งสองไม่ได้ทำอะไรเลย
สกอต

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