ls pip เท่ากับ ls -1 หรือไม่


19

lsคืนค่าเอาต์พุตในหลาย ๆ คอลัมน์ในขณะที่ls|catคืนค่าเอาต์พุตแบบเหมือนไบต์ด้วยls -1สำหรับไดเรกทอรีที่ฉันได้ลอง ฉันยังคงเห็นประปาในคำตอบเช่นls -1 ls -1|wc -lมีเหตุผลที่จะชอบls -1ไหม? ทำไมไม่...|catเปลี่ยนการส่งออกของls?


1
ชื่อไฟล์อาจมีการขึ้นบรรทัดใหม่ดังนั้นคุณจะนับหลาย ๆ ครั้ง ... คุณสามารถทำอย่างนั้นแทน: n=0; for i in .* *; do ((n++)) ; done ; echo $n(ดรอป. * ถ้าคุณไม่ต้องการนับพวกนั้น) หรือ: ls -1d ./.* ./* | grep '^\./' | wc -l (เนื่องจากชื่อไฟล์ต้องไม่มี '/')
Olivier Dulac

3
lsเอาต์พุตไปยังเทอร์มินัลโดยทั่วไปจะมีรหัสสีตามค่าเริ่มต้น สำหรับเอาต์พุตไปยังที่ไม่ใช่เทอร์มินัลสีจะถูกปิดใช้งานตามค่าเริ่มต้น ใน GNU นั่นคือ--color={always,auto,never}IIRC ถ้าสีถูกรวมอยู่ในหนึ่ง แต่ไม่ใช่สีอื่นผลลัพธ์อาจปรากฏขึ้นเหมือนกันบนหน้าจอ แต่สีนั้นไม่เหมือนไบต์ (รหัสสีเป็นส่วนหนึ่งของเอาต์พุตของ ls)
CVn

@ MichaelKjörlingฉันคิดว่าคุณควรเขียนเป็นคำตอบ
200_success

@ MichaelKjörlingนั่นเป็นสิ่งที่น่าสนใจที่ฉันไม่ได้พิจารณา มีวิธีการทั่วไปในการวางท่อเหมือนส่งสัญญาณไปยังเทอร์มินัลโดยไม่ต้องจำตัวเลือกเทอร์มินัลสำหรับเอาท์พุทสีและคอลัมน์หรือไม่?
rubystallion

@Rubystallion มันฟังดูเป็นคำถามแยกต่างหาก
CVn

คำตอบ:


26

lsทดสอบว่าเอาต์พุตกำลังจะไปที่เทอร์มินัลหรือไม่ หากเอาต์พุตไม่ได้ไปที่เทอร์มินัลแสดงว่า-1เป็นค่าเริ่มต้น (ซึ่งสามารถแทนที่โดยหนึ่งใน-C, -mหรือ-xตัวเลือก.)

ดังนั้นเมื่อlsถูกนำมาใช้ในท่อและคุณยังไม่ได้แทนที่มันด้วยตัวเลือกอื่นจะใช้ ls คุณสามารถเชื่อถือได้เนื่องจาก POSIX ต้องการการทำงานนี้-1

ข้อมูลจำเพาะ POSIX

POSIX ต้องการ-1เป็นค่าเริ่มต้นเมื่อเอาต์พุตไม่ได้ไปที่เทอร์มินัล:

ข้อมูลจำเพาะ POSIX :

รูปแบบเริ่มต้นจะต้องแสดงรายการหนึ่งรายการต่อบรรทัดไปยังเอาต์พุตมาตรฐาน ข้อยกเว้นสำหรับเทอร์มินัลหรือเมื่อระบุหนึ่งในตัวเลือก -C, -m หรือ -x หากเอาต์พุตเป็นเทอร์มินัลรูปแบบจะถูกกำหนดโดยการนำไปใช้งาน

สามตัวเลือกเหล่านั้นซึ่งแทนที่รูปแบบคอลัมน์เดี่ยวเริ่มต้นคือ:

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


รูปแบบการส่งออกกระแส-m ; รายการชื่อพา ธ ทั่วทั้งหน้าคั่นด้วยอักขระ <comma> ตามด้วยอักขระ <space> ใช้อักขระ <newline> เป็น list terminator และหลังจากลำดับตัวคั่นเมื่อไม่มีที่ว่างบนบรรทัดสำหรับรายการถัดไป ตัวเลือกนี้จะปิดการใช้งานรูปแบบยาวเอาท์พุท

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

เอกสาร GNU

จากGNU ls ด้วยตนเอง :

'-1'
'- รูปแบบ = คอลัมน์เดียว' แสดง
หนึ่งไฟล์ต่อบรรทัด นี่คือการเริ่มต้นสำหรับ LS เมื่อออกมาตรฐานไม่ได้เป็นขั้ว ดูเพิ่มเติมที่ตัวเลือก -b และ -q เพื่อระงับเอาต์พุตโดยตรงของอักขระบรรทัดใหม่ภายในชื่อไฟล์ [เน้นเพิ่ม]

ตัวอย่าง

ลองสร้างสามไฟล์:

$ touch file{1..3}

เมื่อเอาต์พุตไปที่เทอร์มินัล GNU lsเลือกใช้รูปแบบหลายคอลัมน์:

$ ls
file1  file2  file3

เมื่อเอาต์พุตไปที่ไพพ์ไลน์ข้อมูลจำเพาะ POSIX ต้องการให้คอลัมน์เดี่ยวเป็นค่าเริ่มต้น:

$ ls | cat
file1
file2
file3

ข้อยกเว้นสามข้อที่แทนที่ลักษณะการทำงานของคอลัมน์เดี่ยวเริ่มต้น-mสำหรับการคั่นด้วยเครื่องหมายจุลภาค, -Cสำหรับคอลัมน์ที่เรียงลำดับลงและ-xสำหรับคอลัมน์ที่เรียงลำดับข้าม:

$ ls -m | cat
file1, file2, file3
$ ls -C | cat
file1  file2  file3
$ ls -x | cat
file1  file2  file3

"POSIX ต้องการ -1 เป็นค่าเริ่มต้นเมื่อเอาต์พุตไปยังเทอร์มินัล:" ... แต่เครื่องหมายคำพูดระบุว่าต้องการ-1เป็นค่าเริ่มต้นยกเว้นเมื่อเอาต์พุตไปที่เทอร์มินัล (หรือเงื่อนไขอื่น ๆ )
muru

@muru ขอบคุณสำหรับการจับ! อัปเดตคำตอบแล้ว
John1024

เมฆทุกก้อนมีซับในสีเงิน เนื่องจากคำตอบของคุณได้รับการยอมรับก่อนที่จะโพสต์ของฉันฉันได้รับหมวกพิซซ่าขี้ขลาด!
G-Man กล่าวว่า 'Reinstate Monica'

@ G-Man ดีมาก และหมวกหล่อ!
John1024

9
  • ทำไมท่อออกมาตรฐานการเปลี่ยนแปลงพฤติกรรมของls? เพราะมันถูกออกแบบมาอย่างนั้น POSIX ข้อมูลจำเพาะพูดว่า:

    รูปแบบเริ่มต้นจะต้องแสดงรายการหนึ่งรายการต่อบรรทัดไปยังเอาต์พุตมาตรฐาน ข้อยกเว้นที่มีขั้วหรือเมื่อหนึ่งใน-C, -mหรือ-xตัวเลือกที่ระบุไว้ หากเอาต์พุตเป็นเทอร์มินัลรูปแบบจะถูกกำหนดโดยการนำไปใช้งาน

    ซึ่งจริง ๆ แล้วคลุมเครือเกี่ยวกับพฤติกรรมเริ่มต้น (เมื่อไม่ได้ระบุโดยตัวเลือกเช่น-lหรือ-1) กับเอาท์พุทไปยังสถานีและเอกสารประกอบของ CoreUtils GNUพูดว่า

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

    ดังนั้นคุณจะเห็นว่าเอาต์พุตไปยังไฟล์จะทำหน้าที่เหมือนกับเอาต์พุตไปยังไพพ์ นั่นคือหนึ่งรายการต่อบรรทัดราวกับว่า-1มีการระบุไว้

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

-4

เมื่อ pip ls, ls ไม่สามารถกำหนดจำนวนคอลัมน์ที่คอนโซลมีอยู่จริง (เป็นอิสระจากคำสั่งด้านขวา) ดังนั้น ls ก็ทำเช่นนั้นตามทางเลือกของตัวเองหรือในคำอื่น ๆ พฤติกรรมนี้ไม่เสถียรและอาจเปลี่ยนแปลงในรุ่นอนาคต

ในทางตรงกันข้ามls -1ถูกสร้างขึ้นเพื่อวัตถุประสงค์ในการนับหรือการเขียนสคริปต์โดยทั่วไปดังนั้นพฤติกรรมของมันจึงมีความเสถียร


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