ความแตกต่างของประสิทธิภาพระหว่าง stdin และอาร์กิวเมนต์บรรทัดคำสั่ง


11

สำหรับบางคำสั่งคุณสามารถระบุอินพุตบางตัวเป็น stdin หรืออาร์กิวเมนต์บรรทัดคำสั่ง

โดยเฉพาะสมมติว่าcommandสามารถใช้การป้อนข้อมูล stdin และชื่อไฟล์เป็นอาร์กิวเมนต์บรรทัดคำสั่งและcommand < myfile, cat myfile | command และcommand myfileสามารถผลิตผลเดียวกัน

ตัวอย่างเช่น,

เมื่อคำสั่งคือsed:

sed s/day/night/ <myfile >new   
sed s/day/night/ myfile >new    
cat myfile | sed s/day/night/ >new

เมื่อคำสั่งคือcat:

cat < myfile
cat myfile
  1. ฉันสงสัยว่ามีกฎทั่วไปเกี่ยวกับการแสดงของพวกเขาหรือไม่นั่นคือหนึ่งในนั้นที่มักจะมีประสิทธิภาพมากที่สุดและอย่างน้อยที่สุด?
  2. การเปลี่ยนเส้นทางดีกว่าไปป์เสมอหรือไม่

1
ฉันหวังว่าทุกคนที่ถามคำถาม (ซ้ำ) เหล่านี้จะไปและเขียนเปลือกของตัวเองตั้งแต่เริ่มต้นเป็นแบบฝึกหัด
alex

1
โปรดอย่าใช้ "ขอบคุณ!" ในคำถามของคุณ โหวตคำตอบเพื่อแสดงความขอบคุณของคุณ
alex

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

1
@alex: ฉันจะเรียนรู้วิธีเขียนเชลล์ของตัวเองได้ที่ไหน
ทิม

@Caleb: ฉันแน่ใจว่านี่ถูกถามเช่น 2 หรือ 3 ครั้งในเดือนที่ผ่านมาเพียงแค่ไม่มีลิงค์ที่มีประโยชน์ :-p
alex

คำตอบ:


6

cat file | commandไวยากรณ์ถือว่าเป็นการใช้ประโยชน์ของ Catจากตัวเลือกทั้งหมดของคุณจะได้รับผลการทำงานที่ยอดเยี่ยมเนื่องจากจะต้องวางกระบวนการอื่นในเคอร์เนล อย่างไรก็ตามสิ่งสำคัญนี้อาจกลายเป็นในภาพรวมมันไม่มีค่าใช้จ่ายในรูปแบบอื่น ๆ สิ่งนี้ได้รับการกล่าวถึงในคำถามเช่น: ฉันควรสนใจแมวที่ไม่จำเป็นหรือไม่?

ระหว่างอีกสองรูปแบบแทบไม่มีความแตกต่างด้านประสิทธิภาพ STDIN เป็นโหนดไฟล์พิเศษที่กระบวนการมีการเปิดและอ่านเหมือนกัน การส่งชื่อไฟล์แทนที่จะเป็น STDIN เพียงแค่ทำให้มันเปิดไฟล์อื่น

ความแตกต่างจะอยู่ที่คุณสมบัติ / ความยืดหยุ่นที่คุณกำลังมองหา

  • การส่งชื่อไฟล์ไปยังโปรแกรมจะหมายถึงไฟล์อินพุตนั้นสามารถค้นหาได้ สิ่งนี้อาจจะหรือไม่สำคัญกับโปรแกรม แต่การดำเนินการบางอย่างสามารถเร่งความเร็วได้หากสามารถหากระแสได้
  • การรู้จักไฟล์อินพุตที่แท้จริงช่วยให้โปรแกรมของคุณเขียนได้ ตัวอย่างเช่นsed -iการแก้ไขในสถานที่ (หมายเหตุ: เนื่องจากต้องสร้างไฟล์ใหม่หลังฉากจึงไม่ได้ประสิทธิภาพมากกว่าการเปลี่ยนเส้นทางอื่น แต่เป็นขั้นตอนที่สะดวก)
  • การใช้การเปลี่ยนเส้นทางของเชลล์ช่วยให้คุณสามารถเชื่อมต่อหลายไฟล์หรือแม้กระทั่งใช้การเปลี่ยนเส้นทางของกระบวนการ หรือแม้กระทั่งsed [exp] < file1 file2 sed [exp] < <(grep command)รายละเอียดของกรณีการใช้งานสามารถพบได้ในคำถามนี้: กระบวนการทดแทนและท่อ

การทดแทนกระบวนการควรทำงานโดยไม่ต้องให้คุณใช้ผลลัพธ์ sed [exp] < <(grep command)จะทำงานได้ดีเนื่องจากsed [exp] <(grep command)( <(grep command)สร้างไฟล์ชั่วคราวที่มีชื่อตามความยาวของคำสั่งซึ่งsedสามารถเปิดได้อย่างสมบูรณ์โดยไม่ต้องใช้เชลล์)
ShadowRanger

2
  1. ระบุว่าcommand fileเพิ่งเปิดไฟล์และหลังจากนั้นทำงานเหมือนว่ามันstdinมีความแตกต่างเล็กน้อย ด้วยการเปลี่ยนเส้นทางเชลล์คุณเพียงแค่เปิดไฟล์ไว้ล่วงหน้า (เชลล์ทำ) ตรงข้ามกับคำสั่ง binary เอง

  2. หากเรากำลังพูดถึงcat file | commandกับcommand <fileแล้วก็เป็นที่นิยมกว่า คุณจะไม่สังเกตเห็นความแตกต่างของประสิทธิภาพที่มีนัยสำคัญระหว่างทั้งสอง แต่ก่อนหน้านี้มีความซับซ้อนเกินความจำเป็น (กระบวนการเพิ่มเติมและบัฟเฟอร์หน่วยความจำแบบแบ่งใช้สำหรับไปป์ที่มีปริมาณงาน จำกัด ) นอกจากนี้คุณไม่สามารถseek(เปลี่ยนตำแหน่งตัวชี้ไฟล์ ไปป์ในขณะที่คุณสามารถในไฟล์ธรรมดา บางคำสั่งอาจใช้อัลกอริทึมที่มีประสิทธิภาพมากขึ้นเมื่อseek-ing ในไฟล์อินพุตเป็นไปได้


ฉันจะบอกว่าไฟล์คำสั่งเป็นที่ต้องการมากกว่าคำสั่ง <file เพราะคำสั่งอาจทำการเข้าถึงแบบไม่ต่อเนื่อง
user606723

และอะไรที่จะห้ามไม่ให้ทำเช่นนั้นด้วย<file? จุดของคุณถูกต้องสำหรับการใช้ชื่อแฟ้มใส่กับชื่อไฟล์ที่ส่งออกการสืบทอดมายากเช่น: ผลิตgzip file file.gz
alex

บางทีฉันอาจไม่เข้าใจว่าการเปลี่ยนเส้นทางทำงานอย่างไรภายใน สมมติว่าเราเปลี่ยนเส้นทางภาพยนตร์ 12GB ไปเป็น mplayer / vlc จากนั้นเราก็ข้ามไปยังจุดสิ้นสุด จะเกิดอะไรขึ้นในกรณีนี้
user606723

1
เชลล์เปิดไฟล์และขอให้กระบวนการย่อยซึ่งสืบทอดไฟล์ descriptor กระบวนการที่แยกcloseกันstdinและเรียกdupใช้ตัวอธิบายไฟล์ที่เปิดดังนั้นจึงเป็นการแทนที่ตัวเก่าstdin(ซึ่งส่วนใหญ่เป็น tty ในกรณีส่วนใหญ่) จากมุมมองของโปรแกรมเล่นภาพยนตร์ไม่มีความแตกต่างระหว่างสิ่งนั้นกับการเปิดไฟล์โดยใช้ชื่อใน ผู้เล่นเอง ตัวอธิบายไฟล์นั้นสามารถค้นหาได้ในทั้งสองสถานการณ์ดังนั้นเมื่อเราข้ามไปจนจบไม่มีความแตกต่างที่ผู้ใช้ตรวจพบได้
alex
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.