ทำไมการจัดเรียง -o จึงมีประโยชน์


32

ปรัชญา UNIX พูดว่า: ทำสิ่งหนึ่งและทำได้ดี สร้างโปรแกรมที่จัดการข้อความเนื่องจากเป็นอินเตอร์เฟซสากล

sortคำสั่งอย่างน้อยการจัดเรียงของ GNU มีตัวเลือกในการส่งออกไปยังไฟล์แทน-o stdoutทำไมจึงพูดsort foobar -o whateverประโยชน์เมื่อฉันสามารถทำได้เพียงแค่sort foobar > whatever?


3
GNU ไม่ใช่ UNIX ในหลาย ๆ ด้านมันแตกต่างกันตัวอย่างเช่นการโต้แย้งอย่างละเอียด (- ช่วยเหลือ ฯลฯ )
sakisk

@faif ใช่ว่าเป็นความจริง แต่ฉันจะยืนยันว่านั่นไม่ใช่คำตอบสำหรับคำถามเฉพาะนี้
strugee

2
นั่นเป็นเหตุผลที่ผมทิ้งมันไว้เป็นความคิดเห็นและไม่ได้คำตอบ :)
sakisk

คำตอบ:


47

มันไม่ใช่แค่ GNU sort เท่านั้นที่มี การจัดเรียง BSD ก็มีเช่นกัน และทำไม?
(ฉันคิดว่ามันเป็นคำถามที่ดีเช่นกัน ... )

จากหน้า man: "อาร์กิวเมนต์ที่กำหนดคือชื่อของไฟล์เอาต์พุตที่จะใช้แทนเอาต์พุตมาตรฐานไฟล์นี้สามารถเหมือนกับไฟล์อินพุตไฟล์ใดไฟล์หนึ่ง"

คุณไม่สามารถไปที่ไฟล์เดียวกันกับการเปลี่ยนเส้นทางการเปลี่ยนเส้นทางเอาต์พุตจะลบไฟล์

sort < foo > fooเพื่อชี้แจงต่อไปถ้าผมต้องการที่จะเรียงลำดับไฟล์และนำผลการเรียงลำดับในสถานที่เดียวกันที่ผมอาจจะคิดที่จะลอง ยกเว้นการเปลี่ยนเส้นทางเอาต์พุตตัดทอนไฟล์fooในการเตรียมการเพื่อรับเอาต์พุต แล้วไม่มีอะไรให้เรียง โดยไม่ต้อง "-o" sort < foo > bar ; mv bar fooวิธีที่จะทำมันจะเป็น ฉันคิดว่า-oตัวเลือกทำสิ่งที่คล้ายกันโดยไม่ทำให้คุณต้องกังวลเกี่ยวกับมัน


12
คุณสามารถsudo sort -o /some/placeที่ผู้ใช้ที่ไม่ใช่ผู้มีสิทธิ์พิเศษของคุณไม่ได้รับอนุญาตให้เขียน
บาฮามา

8
และเพื่อช่วยหลีกเลี่ยงความสับสนกับความคิดเห็นของบาฮามาต: เขาไม่ได้บอกว่าพวกเขาสามารถจัดเรียงไฟล์ที่พวกเขาไม่มีสิทธิ์ใช้งานได้ การเปลี่ยนเส้นทาง I / O ทำงานได้ไม่ดีกับ sudo เนื่องจากการเปลี่ยนเส้นทางเกิดขึ้นในเชลล์ของคุณ (sudo เป็นเพียงคำสั่งที่มันจะทำงาน) การใช้การเปลี่ยนเส้นทางกับคำสั่งผ่าน sudo จึงน่ารำคาญ (ตอนแรกฉันสับสนว่าบาฮามาตกำลังพูดอะไรดังนั้นคนอื่นอาจคิดว่าสับสนเหมือนกัน)
kurtm

3
เพียงแค่เล่นทนายของปีศาจมีทางเลือกทั้งปัญหา "ไฟล์อินพุตเหมือนกับปัญหาไฟล์เอาท์พุต" และ "การเปลี่ยนเส้นทางสิทธิพิเศษ" และทั้งสองทางเลือกมีอยู่ในจิตวิญญาณของ "ทำสิ่งที่ดี" สำหรับ "input = output" นั่นคือsponge(ส่วนหนึ่งของ moreutils) สำหรับการเปลี่ยนเส้นทางที่มีสิทธิพิเศษจะมีการส่งไป| sudo teeยังซึ่งมีประโยชน์ในการ จำกัด การเพิ่มระดับสิทธิ์ให้กับโปรแกรมอย่างง่ายเพียงโปรแกรมteeเดียว
jw013

จุดที่ดี แม้ว่า-oตัวเลือกที่จะsortมีอยู่นานก่อนฟองน้ำ อย่างน้อยก็เก่าเท่ากับ 4.4-lite2 (ซึ่งเป็นที่ที่ประวัติเริ่มต้นใน OpenBSD CVS) และสำหรับกรณีที่คุณทำงานกับไฟล์ที่ไม่มีสิทธิพิเศษและการเขียนไปยังพื้นที่ที่มีสิทธิพิเศษนั้นใช้| sudo teeงานได้ดี แต่ส่วนใหญ่แล้วคุณต้องการให้ทุกอย่างเป็นสิทธิพิเศษและsudoเดินทางไปกับคุณ และsudo grep file | sudo teeโง่
kurtm

1
sortจำเป็นต้องอ่านอินพุตทั้งหมดก่อนที่จะสามารถเริ่มการส่งออกอะไรก็ได้นั่นคือสาเหตุที่มันสามารถเขียนทับอินพุตได้อย่างปลอดภัย มันอาจเก็บข้อมูลในหน่วยความจำหรือในไฟล์ชั่วคราวก่อนที่จะเริ่มออก
Stéphane Chazelas

12

ตัวเลือก '-o' มีอยู่แล้วในที่sortของรุ่นที่หกของยูนิกซ์

อย่างไรก็ตามฉันเห็นด้วยกับคุณว่ามันไม่ได้อยู่ในปรัชญา Unix uniqไม่มีตัวเลือกนั้น (และsortไม่มีตัวเลือก-u)

ใน PDP-11 ของฉันฉันใช้โปรแกรมขนาดเล็กที่จะใช้พารามิเตอร์เดียว:

renac whatever

หากwhateverมีอยู่แล้วมันจะเขียนทุกอย่างจาก stdin ไปเป็นไฟล์ชั่วคราวที่ถูกเปลี่ยนชื่อเป็นwhateverหลังจากอินพุต stdin แห้ง ด้วยวิธีนี้คุณสามารถไพพ์เอาต์พุตของคำสั่งใด ๆrenacแทนการเปลี่ยนเส้นทางไปยังชื่อไฟล์โดยไม่มีโอกาสเขียนทับอินพุต การแก้ปัญหาการเขียนทับในลักษณะนั้น IMHO นั้นสอดคล้องกับปรัชญาของ Unix มากกว่า

บางส่วนที่เพิ่มเติมในโปรแกรมคือ: ไม่เขียนทับไฟล์เอาต์พุตหากไม่มีสิ่งใดมาถึง stdin (เช่นผลลัพธ์ของการพิมพ์ผิดส่วนหนึ่งของ commandline) และอนุญาตให้ตัวเลือกผนวก stdin กับไฟล์ที่ระบุชื่อ

นี่เป็นหนึ่งในโปรแกรม C จริงตัวแรก (ถ้าไม่ใช่ก่อน) ที่ฉันทำ (สำหรับงานของฉันฉันส่วนใหญ่พัฒนาใน Pascal ในระบบนั้น)


ถ้าฉันเข้าใจดีคนaptGNU / Linux ที่ปรุงแต่งรสชาติสามารถมีฟังก์ชั่นเวอร์ชันที่เขียนใหม่renacพร้อมด้วยโปรแกรมที่เรียกว่าsponge(จากman: ดื่มด่ำกับอินพุตมาตรฐานและเขียนลงในไฟล์), package moreutils`
41754

@uprego ฉันเพิ่งดูแหล่งที่มาของ sponge.c และดูเหมือนว่าจะมีรหัสค่าใช้จ่ายจำนวนมากเพราะฟังก์ชั่นฟองน้ำ (stdin -> stdout)
Anthon

@uprego ค่าspongeมิได้moreutilsถูกสร้างขึ้นจริงโดย GNU
jw013

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