ครอบคลุม 1) คำถามของคุณเท่านั้น
APIs ตามธรรมชาติสามารถเปลี่ยนแปลงได้ตามความประสงค์ของผู้สร้างและจะแตกซอฟต์แวร์ที่ต้องพึ่งพาในทุกภาษา ที่กล่าวว่าความคิดที่ดีในเครื่องมือที่ใช้ระบบปฏิบัติการยูนิกซ์I / O 'APIs' คือว่ามีจริงไม่มี (อาจจะ0x0a
เป็นจุดสิ้นสุดบรรทัด) สคริปต์ที่ดีจะกรองข้อมูลด้วยเครื่องมือ Unix แทนที่จะสร้างมันขึ้นมา นั่นหมายความว่าสคริปต์ของคุณอาจแตกเนื่องจากข้อมูลจำเพาะของอินพุตหรือเอาต์พุตเปลี่ยนไป แต่ไม่ใช่เพราะรูปแบบ I / O (อีกครั้งไม่มีจริง ๆ ) ของเครื่องมือแต่ละรายการที่ใช้ในสคริปต์เปลี่ยนไป (เพราะสิ่งที่ไม่มีอยู่จริง ไม่สามารถเปลี่ยนแปลงได้)
จะผ่านรายการของเครื่องมือพื้นฐานมีไม่กี่ที่ฉันจะผลิตคุณลักษณะเมื่อเทียบกับตัวกรองเท่านั้น:
- wc - พิมพ์จำนวนไบต์, คำ, บรรทัด - รูปแบบที่ง่ายมากจึงไม่น่าจะเปลี่ยนแปลงอย่างแน่นอนและไม่น่าจะมีการใช้งานในสคริปต์
- diff - มีการพัฒนารูปแบบผลลัพธ์ที่แตกต่างกัน แต่ฉันไม่เคยได้ยินปัญหาใด ๆ เลย ยังไม่ได้ใช้ตามปกติโดยไม่มีการควบคุม
- วันที่ - ตอนนี้ที่นี่เราต้องดูแลสิ่งที่เราผลิตโดยเฉพาะเกี่ยวกับตำแหน่งที่ตั้งของระบบ แต่รูปแบบเอาต์พุตเป็น RFC'ed เนื่องจากคุณไม่ได้ระบุด้วยตัวคุณเอง
- แคล - อย่าพูดถึงมันฉันรู้ว่ารูปแบบเอาต์พุตแตกต่างกันมากในระบบ
- ls , ใคร , w , ครั้งสุดท้าย - ฉันอดไม่ได้ที่คุณจะแยกวิเคราะห์ ls มันแค่ไม่ได้มีความหมาย ยิ่งไปกว่านั้นใครคือคนสุดท้ายเป็นผู้มีส่วนร่วมมากขึ้น หากคุณใช้มันในสคริปต์คุณต้องดูแลสิ่งที่คุณทำ
- เวลาถูกชี้ให้เห็นในโพสต์อื่น แต่ใช่มันเหมือนกับ ls เพิ่มเติมสำหรับการใช้แบบโต้ตอบ / ท้องถิ่น และ bash builtin นั้นแตกต่างจากรุ่น GNU อย่างมากและรุ่น GNU นั้นมีบั๊กที่ไม่ได้แยกไว้เป็นเวลาหลายปี อย่าพึ่งมัน
นี่คือเครื่องมือที่ต้องการรูปแบบอินพุตเฉพาะเจาะจงมากกว่าการเป็นสตรีมไบต์:
- bc , dc - เครื่องคิดเลข แล้วในสิ่งที่แฮ็คมากขึ้น (จริงๆแล้วฉันไม่ได้ใช้พวกเขาในสคริปต์) และน่าจะเป็นรูปแบบ I / O ที่เสถียรมาก
มีพื้นที่อื่นที่มีความเสี่ยงต่อการแตกสูงกว่ามากคืออินเตอร์เฟสบรรทัดคำสั่ง เครื่องมือส่วนใหญ่มีคุณสมบัติที่แตกต่างกันทั้งในระบบและในไทม์ไลน์ ตัวอย่างคือ
- เครื่องมือทั้งหมดที่ใช้ regex - regex สามารถเปลี่ยนความหมายตามตำแหน่งที่ตั้งของระบบ (เช่น LC_COLLATE) และมีรายละเอียดปลีกย่อยและข้อมูลเชิงลึกจำนวนมากในการนำไปใช้ของ regex
- อย่าใช้สวิตช์แฟนซี คุณสามารถใช้
man 1p find
ตัวอย่างเช่นเพื่ออ่าน POSIX ค้นหา manpage แทน manpage ของระบบ ในระบบของฉันฉันต้องติดตั้ง manpages-posix
และแม้กระทั่งเมื่อใช้สวิตช์ดังกล่าวปกติจะมีข้อผิดพลาดจะไม่ถูกนำมาใช้อย่างละเอียดและทำให้ข้อมูลของคุณเป็นพิษ โปรแกรมส่วนใหญ่จะปฏิเสธที่จะทำงานกับสวิตช์ที่ไม่รู้จัก
โดยสรุปแล้วฉันจะบอกว่าเชลล์มีศักยภาพในการเป็นหนึ่งในภาษาแบบพกพามากที่สุด (มันเป็นแบบพกพาเมื่อคุณสคริปต์พกพา) เปรียบเทียบกับภาษาสคริปต์ที่คุณชื่นชอบซึ่งเกิดข้อผิดพลาดเล็กน้อยหรือโปรแกรมที่คุณโปรดปรานซึ่งจะรวบรวมเพื่อรวบรวม
นอกจากนี้ในสถานที่หายากที่อาจเกิดการแตกเนื่องจากความไม่ลงรอยกันมันอาจจะไม่ใช่เพราะเวลาเกิดขึ้น แต่เนื่องจากความหลากหลายในระบบต่าง ๆ (หมายถึงถ้ามันเหมาะกับคุณมันทำไป 20 ปีก่อนและใน 20 ปี เช่นกัน) นั่นเป็นข้อพิสูจน์ถึงความเรียบง่ายของเครื่องมือ