ฉันสงสัยว่าทำไมมีหลายอย่างที่เกี่ยวข้องกับวิสัยทัศน์ / การออกแบบที่มีรูปแบบ Unix (และต่อจาก Linux) และข้อดีที่เกิดขึ้นจากมัน
ไม่ต้องสงสัยเลยว่ามีข้อดีด้านประสิทธิภาพการทำงานที่ไม่อาจละเลยได้ แต่ฉันคิดว่ามีอีกมาก: Unix ยุคแรกมีอุปมา "ทุกอย่างเป็นไฟล์" ซึ่งมีข้อดีที่ไม่ชัดเจน แต่สง่างามถ้าคุณดู จากมุมมองของระบบมากกว่ามุมมองการเขียนสคริปต์เชลล์
สมมติว่าคุณมีnull
โปรแกรมบรรทัดคำสั่งและ/dev/null
โหนดอุปกรณ์ จากมุมมองของการเขียนสคริปต์ shell foo | null
โปรแกรมจริงๆแล้วมีประโยชน์และสะดวกมากและfoo >/dev/null
ใช้เวลาในการพิมพ์นานกว่าเล็กน้อยและอาจดูแปลก ๆ
แต่นี่คือแบบฝึกหัดสองข้อ:
ลองใช้โปรแกรมnull
โดยใช้เครื่องมือที่มีอยู่และ Unix /dev/null
- cat >/dev/null
ง่าย: เสร็จสิ้น
คุณสามารถนำไปใช้/dev/null
ในแง่ของnull
?
คุณถูกต้องอย่างแน่นอนที่รหัส C ที่จะละทิ้งอินพุตนั้นเล็กน้อยดังนั้นจึงอาจยังไม่ชัดเจนว่าทำไมจึงมีประโยชน์ที่จะมีไฟล์เสมือนสำหรับงาน
พิจารณา: ภาษาการเขียนโปรแกรมเกือบทุกภาษาต้องทำงานกับไฟล์ตัวอธิบายไฟล์และพา ธ ไฟล์เนื่องจากเป็นส่วนหนึ่งของกระบวนทัศน์ "ทุกอย่างเป็นไฟล์" ของ Unix ตั้งแต่ต้น
หากสิ่งที่คุณมีคือโปรแกรมที่เขียนไปยัง stdout โปรแกรมไม่สนใจว่าคุณจะเปลี่ยนเส้นทางไปเป็นไฟล์เสมือนที่กลืนกินการเขียนทั้งหมดหรือไพพ์ลงในโปรแกรมที่กลืนการเขียนทั้งหมด
ตอนนี้ถ้าคุณมีโปรแกรมที่ใช้เส้นทางแฟ้มสำหรับการอ่านหรือเขียนข้อมูล (ซึ่งโปรแกรมส่วนใหญ่ทำ) - และคุณต้องการที่จะเพิ่ม "การป้อนข้อมูลว่างเปล่า" หรือ "ทิ้งเอาท์พุทนี้" การทำงานกับโปรแกรมเหล่านั้น - อย่างดีกับ/dev/null
ที่มาฟรี
โปรดสังเกตว่าความสง่างามของมันคือการลดความซับซ้อนของรหัสของโปรแกรมที่เกี่ยวข้องทั้งหมด - สำหรับแต่ละ usecase ทั่วไป แต่พิเศษที่ระบบของคุณสามารถให้เป็น "ไฟล์" ด้วย "ชื่อไฟล์" จริงรหัสของคุณสามารถหลีกเลี่ยงการเพิ่มคำสั่งที่กำหนดเอง ตัวเลือกบรรทัดและเส้นทางรหัสที่กำหนดเองเพื่อจัดการ
วิศวกรรมซอฟต์แวร์ที่ดีมักจะขึ้นอยู่กับการหาคำอุปมาอุปมัยที่ดีหรือ "เป็นธรรมชาติ" เพื่อสรุปองค์ประกอบของปัญหาในแบบที่คิดง่ายขึ้นแต่ยังคงความยืดหยุ่นเพื่อให้คุณสามารถแก้ปัญหาระดับสูงกว่าเดิมได้โดยไม่ต้อง ใช้เวลาและพลังงานทางจิตในการปรับใช้โซลูชันในระดับต่ำกว่าเดิมอย่างต่อเนื่อง
"ทุกอย่างเป็นไฟล์" ดูเหมือนจะเป็นคำอุปมาอย่างหนึ่งสำหรับการเข้าถึงทรัพยากร: คุณเรียกopen
ใช้พา ธ ที่กำหนดในเนมสเปซแบบสืบทอด, รับการอ้างอิง (ตัวอธิบายไฟล์) ไปยังวัตถุและคุณสามารถread
และwrite
ฯลฯ ใน descriptor ไฟล์ stdin / stdout / stderr ของคุณเป็นไฟล์อธิบายที่เพิ่งจะเปิดให้คุณแล้ว ไพพ์ของคุณเป็นเพียงไฟล์และตัวอธิบายไฟล์และการเปลี่ยนเส้นทางไฟล์ช่วยให้คุณสามารถยึดชิ้นส่วนเหล่านี้เข้าด้วยกัน
ยูนิกซ์ประสบความสำเร็จมากเท่าที่ทำได้เนื่องจากบางส่วนของนามธรรมเหล่านี้ทำงานร่วมกัน/dev/null
ได้ดีและเข้าใจได้ดีที่สุดในฐานะส่วนหนึ่งของทั้งหมด
ป.ล. มันน่าดูรุ่น Unix ของ "ทุกอย่างเป็นไฟล์" และสิ่งต่าง ๆ เช่น/dev/null
ขั้นตอนแรกสู่การวางตัวแบบทั่วไปที่มีความยืดหยุ่นและทรงพลังของอุปมาอุปมัยที่ถูกนำไปใช้ในหลาย ๆ ระบบที่ตามมา
ตัวอย่างเช่นในวัตถุที่คล้ายไฟล์พิเศษของ Unix อย่างเช่น/dev/null
จะต้องมีการใช้งานในเคอร์เนลเอง แต่ปรากฎว่ามันมีประโยชน์พอที่จะเปิดเผยการทำงานในรูปแบบไฟล์ / โฟลเดอร์ที่ตั้งแต่นั้นมามีหลายระบบที่ทำวิธีสำหรับโปรแกรม ทำเช่นนั้น
หนึ่งในคนแรกคือระบบปฏิบัติการแผน 9 ทำโดยคนเดียวกันบางคนที่ทำยูนิกซ์ ต่อมา GNU Hurd ก็ทำสิ่งที่คล้ายกับ "นักแปล" ของมัน ในขณะเดียวกันลีนุกซ์ก็ได้รับ FUSE (ซึ่งแพร่กระจายไปยังระบบกระแสหลักอื่น ๆ ในตอนนี้เช่นกัน)
cat foo | bar
เป็นเลวร้ายมากbar <foo
(ในระดับกว่า)cat
เป็นโปรแกรมเล็ก ๆ น้อย ๆ แต่แม้กระทั่งโปรแกรมเล็ก ๆ น้อย ๆ ก็สร้างค่าใช้จ่ายได้ (บางส่วนของโปรแกรมเฉพาะสำหรับซีแมนทิกส์ FIFO - เนื่องจากโปรแกรมไม่สามารถseek()
อยู่ใน FIFO ได้ตัวอย่างเช่นโปรแกรมที่สามารถใช้งานได้อย่างมีประสิทธิภาพ เมื่อได้รับไพพ์ไลน์ด้วยอุปกรณ์ตัวละครอย่างเช่น/dev/null
มันสามารถปลอมการดำเนินการเหล่านั้นหรือด้วยไฟล์จริงมันสามารถนำไปใช้งานได้ แต่ FIFO ไม่อนุญาตให้มีการจัดการที่คำนึงถึงบริบทใด ๆ )