เอาต์พุตจาก ls มีบรรทัดใหม่ แต่แสดงในบรรทัดเดียว ทำไม?


41

ฉันคิดว่าฉันอาจจะมองเห็นจุดที่ค่อนข้างพื้นฐานเกี่ยวกับเปลือกหอย เอาต์พุตจากคำสั่งlsโดยค่าเริ่มต้นจะแยกเอาต์พุตด้วยบรรทัดใหม่ แต่เชลล์แสดงเอาต์พุตในบรรทัดเดียว

ใครสามารถอธิบายสิ่งนี้ให้ฉันได้บ้าง ฉันสันนิษฐานเสมอว่าเอาต์พุตถูกคั่นด้วยช่องว่าง แต่ตอนนี้เมื่อฉันเห็นเอาต์พุตคั่นด้วยบรรทัดใหม่ฉันคาดว่าเอาต์พุตจะแสดงในบรรทัดแยกกัน

ตัวอย่าง:

cpoweradm@debian:~/lpi103-4$ ls text*
text1  text2  text3

odแสดงว่าเอาต์พุตถูกคั่นด้วยบรรทัดใหม่:

cpoweradm@debian:~/lpi103-4$ ls text* | od -c
0000000   t   e   x   t   1  \n   t   e   x   t   2  \n   t   e   x   t
0000020   3  \n
0000022

หากมีการขึ้นบรรทัดใหม่เหตุใดเอาต์พุตจึงไม่แสดงเป็น:

text1 
text2
text3

คำตอบ:


44

เมื่อคุณไพพ์เอาท์พุทlsทำหน้าที่แตกต่างกัน

ข้อเท็จจริงนี้ถูกซ่อนอยู่ในเอกสารข้อมูล :

หากเอาต์พุตมาตรฐานเป็นเทอร์มินัลเอาต์พุตจะอยู่ในคอลัมน์ (เรียงลำดับตามแนวตั้ง) และอักขระควบคุมจะแสดงเป็นเครื่องหมายคำถาม มิฉะนั้นเอาต์พุตจะแสดงรายการหนึ่งรายการต่อบรรทัดและอักขระควบคุมจะเป็นเอาต์พุตตามที่เป็น

เพื่อพิสูจน์มันลองวิ่ง

ls

แล้ว

ls | less

ซึ่งหมายความว่าหากคุณต้องการให้การรับรองผลลัพธ์เป็นไฟล์หนึ่งไฟล์ต่อบรรทัดไม่ว่าจะถูกไพพ์หรือเปลี่ยนทิศทางคุณต้องรัน

ls -1

( -1คือหมายเลขหนึ่ง)

หรือคุณสามารถบังคับls | lessให้แสดงผลในคอลัมน์โดยเรียกใช้

ls -C

( -Cเป็นเมืองหลวง C)


6
@theconnorpower: lsมันเป็นเฉพาะสวยมาก มันมีประโยชน์ แต่ไม่ชัดเจนและน่าประหลาดใจ แต่โปรดทราบว่าคำสั่งบางอย่างที่สร้างเอาต์พุตสีจะตัดสีออกเมื่อถูกไพพ์ด้วย
มิเคล

5
@theconnorpower: สิ่งละอันพันละน้อย: นักประดิษฐ์ของ Unix ไปเขียน Plan9 ใน Plan9 ให้lsพิมพ์หนึ่งรายการต่อบรรทัดlcเสมอและพิมพ์ในคอลัมน์เสมอ
มิเคล

2
@theconnorpower: นอกจากนี้ยังมีโปรแกรมที่อ่านขนาดของเทอร์มินัลและปรับเอาท์พุทให้สอดคล้องกันตัวอย่างเช่น Debian dpkg -lจะใช้ความกว้างทั้งหมดของหน้าจอ แต่ถ้าพิมพ์ไปที่ท่อจะถือว่าเทอร์มินัลมีความกว้าง 80 คอลัมน์ และย่อเอาต์พุตเพื่อให้เหมาะสมหากจำเป็น
มิเคล

1
@Mikel ที่น่าสนใจที่จะได้ยินความแตกต่าง ls / lc ใน Plan9 ขอบคุณสำหรับคำตอบโดยละเอียด
zod90

1
โปรแกรมจะตัดสินได้อย่างไรว่าเอาต์พุตของมันถูกเปลี่ยนเส้นทางไปยังไฟล์หรือไม่ว่ามันจะไปยังเชลล์หรือไม่?
2820379

4

การค้นพบของคุณเน้นเหตุผลหลักว่าทำไมการแยกวิเคราะห์ผลลัพธ์lsเป็นความคิดที่ไม่ดีเสมอ ดูวิกิพีเดียของเกร็กสำหรับคำอธิบายแบบเต็มรูปแบบ

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

file1
file2\nfile3
file4

เมื่อคุณls -1มีไดเรกทอรีในนั้นคุณจะได้สิ่งที่มีลักษณะดังนี้:

file1
file2
file3
file4

คุณจะไม่เชื่อว่ามีไฟล์อยู่สี่ไฟล์หรือไม่? ดังนั้นสคริปต์ใด ๆ ที่แยกผลลัพธ์ของ ls ในความเป็นจริงมีไฟล์สามไฟล์หนึ่งในนั้นมีชื่อที่ยุ่งยาก แต่คุณจะไม่สามารถคิดออกจากผลลัพธ์ของ ls *

* ยกเว้นว่าคุณกำลังใช้-lธงและสังเกตว่าผลลัพธ์นั้นได้รับการบอร์ก แต่สคริปต์ของคุณจะยังคงทำให้หายใจไม่ออก


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