ชุมชน shell scripting กำลังมีการถกเถียงอย่างเข้มข้นเกี่ยวกับขีดจำกัดที่เหมาะสมของความซับซ้อนใน shell หลังจากมีการสาธิตเทคนิคขั้นสูงสำหรับการจัดการ first-class lists ใน shell แบบดั้งเดิม แม้ว่าโซลูชันที่นวัตกรรมใหม่ที่ใช้เครื่องมืออย่าง jq และ shell ทางเลือกอย่าง es จะแสดงความสามารถทางเทคนิคที่น่าประทับใจ แต่นักพัฒนาจำนวนมากกำลังตั้งคำถามว่าความซับซ้อนเช่นนี้ข้ามเส้นไปสู่ดินแดนที่ดูแลรักษาไม่ได้หรือไม่
Shell ทางเลือกสมัยใหม่ได้รับการยอมรับมากขึ้น
การถกเถียงครั้งนี้ได้เน้นย้ำถึง shell ทางเลือกสมัยใหม่หลายตัวที่แก้ไขข้อจำกัดแบบดั้งเดิม YSH (เดิมชื่อ Oil Shell ) ได้กลายเป็นตัวเลือกที่น่าสนใจเป็นพิเศษ โดยมีไวยากรณ์คล้าย Python ในขณะที่ยังคงความเข้ากันได้กับ shell ผู้ใช้สามารถสร้างและจัดการลิสต์ด้วย slice notation ที่คุ้นเคย ทำให้การดำเนินการที่ซับซ้อนอ่านง่ายกว่าแนวทางแบบ shell ดั้งเดิม
PowerShell และ nushell ก็ได้รับความสนใจเช่นกันในฐานะทางเลือกที่มีการจัดการข้อมูลที่มีโครงสร้างตั้งแต่เริ่มต้น shell เหล่านี้ขจัดการแก้ไขชั่วคราวจำนวนมากที่จำเป็นใน shell แบบ Bourne-derived ดั้งเดิม โดยมีการสนับสนุนแบบเนทีฟสำหรับออบเจ็กต์และลิสต์ที่ทำให้งาน scripting ที่ซับซ้อนตรงไปตรงมามากขึ้น
หมายเหตุ: YSH เป็น shell ที่รวมฟีเจอร์ shell แบบดั้งเดิมกับโครงสร้างภาษาโปรแกรมมิ่งสมัยใหม่ ได้รับการพัฒนาเป็นส่วนหนึ่งของโปรเจ็กต์ Oil
การเปรียบเทียบ Shell ทางเลือกสมัยใหม่
Shell | คุณสมบัติหลัก | กรณีการใช้งานที่เหมาะสม |
---|---|---|
YSH (Oil Shell) | ไวยากรณ์คล้าย Python , การแบ่งส่วนรายการ, ความเข้ากันได้กับ shell | การเปลี่ยนผ่านจาก shell แบบดั้งเดิม |
PowerShell | เชิงวัตถุ, การรวมเข้ากับ .NET , ข้อมูลที่มีโครงสร้าง | สภาพแวดล้อม Windows , การดูแลระบบ |
nushell | ไปป์ไลน์ข้อมูลที่มีโครงสร้าง, ไวยากรณ์สมัยใหม่ | การประมวลผลข้อมูล, การเขียนสคริปต์ข้ามแพลตฟอร์ม |
es shell | ฟังก์ชันระดับแรก, closures, การส่งคืนค่าที่มีโครงสร้าง | แนวทางการเขียนโปรแกรมเชิงฟังก์ชัน |
การถกเถียงเรื่องขีดจำกัดความซับซ้อน
ส่วนใหญ่ของชุมชนโต้แย้งว่าเทคนิค shell ขั้นสูง แม้จะน่าประทับใจทางเทคนิค แต่แสดงถึงการใช้งานผิดพื้นฐานของสภาพแวดล้อม shell ความรู้สึกนี้สะท้อนถึงการแบ่งแยกทางปรัชญาที่กว้างขึ้นเกี่ยวกับบทบาทที่เหมาะสมของ shell scripting ในเวิร์กโฟลว์การพัฒนาสมัยใหม่
เมื่อคุณต้องการความซับซ้อนนี้ใน shell คุณต้องการสิ่งอื่นๆ ที่คุณควรได้รับจาก stdlib ของภาษา ดังนั้นผมจะขอให้พวกเขาเปลี่ยนไปใช้ Python หรือ Go
มุมมองนี้เน้นย้ำว่า shell ควรยังคงมุ่งเน้นไปที่จุดแข็งหลัก: การจัดการกระบวนการ การจัดการไฟล์ และงานอัตโนมัติง่ายๆ เมื่อสคริปต์ต้องการโครงสร้างข้อมูลที่ซับซ้อนหรือตรรกะที่ซับซ้อน ตามการโต้แย้ง ก็ถึงเวลาที่จะย้ายไปใช้ภาษาโปรแกรมมิ่งอเนกประสงค์ที่มีการจัดการข้อผิดพลาดที่เหมาะสม เครื่องมือดีบัก และไลบรารีมาตรฐาน
ข้อกังวลเรื่องการปรับใช้ในโปรดักชัน
การถกเถียงเผยให้เห็นข้อกังวลเฉพาะเกี่ยวกับการใช้สคริปต์ shell ที่ซับซ้อนในสภาพแวดล้อมโปรดักชัน ปัญหาหลักสามประการครอบงำข้อกังวลนี้: การพึ่งพาที่ซ่อนอยู่ การจัดการข้อผิดพลาดที่ไม่เพียงพอ และข้อจำกัดด้านประสิทธิภาพ นักพัฒนาที่มีประสบการณ์จำนวนมากรายงานว่าเห็นสคริปต์ shell เติบโตแบบออร์แกนิกจากงานอัตโนมัติง่ายๆ ไปเป็นคอมโพเนนต์ระบบที่สำคัญ โดยมักไม่มีการพิจารณาความต้องการด้านการดูแลรักษาหรือความน่าเชื่อถืออย่างเหมาะสม
ฉันทามติในหมู่นักพัฒนาที่เน้นโปรดักชันคือ shell scripting ควรจำกัดไว้ที่การดำเนินการ bootstrap สคริปต์บิลด์ และการทำงานอัตโนมัติในเครื่อง สำหรับระบบที่ปรับใช้แล้ว การให้ความสำคัญอย่างมากคือภาษาที่มีการจัดการข้อผิดพลาดที่แข็งแกร่ง เฟรมเวิร์กการทดสอบที่ครอบคลุม และลักษณะประสิทธิภาพที่คาดเดาได้
แนวทางความซับซ้อนของ Shell Scripting
เหมาะสำหรับ Shell:
- การจัดการกระบวนการและการดำเนินงาน pipeline
- การจัดการระบบไฟล์และการประมวลผลข้อความพื้นฐาน
- สคริปต์สำหรับ build และการดำเนินงาน bootstrap
- งานอัตโนมัติง่ายๆ ที่มีตรรกะน้อย
ควรพิจารณาภาษาอื่นเมื่อ:
- ต้องการโครงสร้างข้อมูลที่ซับซ้อน
- ต้องการการจัดการข้อผิดพลาดที่ซับซ้อน
- ประสิทธิภาพเป็นสิ่งสำคัญ
- มีนักพัฒนาหลายคนที่จะต้องดูแลรักษาโค้ด
- มีแผนการ deploy ในระบบ production
การสร้างสมดุลระหว่างนวัตกรรมและการปฏิบัติ
แม้จะมีคำเตือนเกี่ยวกับความซับซ้อน สมาชิกชุมชนบางส่วนยังชื่นชมคุณค่าด้านการศึกษาและการสำรวจของเทคนิค shell ขั้นสูง แนวทางเหล่านี้สามารถให้ข้อมูลเชิงลึกเกี่ยวกับความสามารถของ shell และทำหน้าที่เป็นก้าวย่างไปสู่การเข้าใจแนวคิดการเขียนโปรแกรมที่ซับซ้อนมากขึ้น
สิ่งสำคัญดูเหมือนจะเป็นการตระหนักรู้บริบท เทคนิค shell ขั้นสูงอาจเหมาะสมสำหรับการทำงานอัตโนมัติส่วนบุคคล แบบฝึกหัดการเรียนรู้ หรือสภาพแวดล้อมเฉพาะที่มีการควบคุมการพึ่งพา อย่างไรก็ตาม พวกเขากลายเป็นปัญหาเมื่อใช้ในโค้ดเบสที่แชร์ ระบบโปรดักชัน หรือสภาพแวดล้อมที่นักพัฒนาหลายคนต้องดูแลรักษาโค้ด
การถกเถียงที่กำลังดำเนินอยู่สะท้อนถึงความเป็นผู้ใหญ่ของชุมชน shell scripting ขณะที่นักพัฒนาต่อสู้กับการสร้างสมดุลระหว่างความสามารถทางเทคนิคกับการดูแลรักษาเชิงปฏิบัติ ในขณะที่เครื่องมือและเทคนิคยังคงพัฒนาต่อไป คำถามพื้นฐานยังคงอยู่: เพียงเพราะสิ่งใดสิ่งหนึ่งสามารถทำได้ใน shell ไม่ได้หมายความว่าควรทำ
อ้างอิง: More shell tricks: first class lists, jq, and the es shell