การเปิดตัวไลบรารี Bash INI Parser ล่าสุดได้จุดประเด็นการถกเถียงอย่างเข้มข้นในหมู่นักพัฒนาเกี่ยวกับว่าเมื่อใดที่ควรเลิกใช้ shell scripts และหันไปใช้ภาษาโปรแกรมมิ่งที่แข็งแกร่งกว่า ไลบรารีนี้ซึ่งมีฟังก์ชันสำหรับการแยกวิเคราะห์และจัดการไฟล์คอนฟิกูเรชัน INI โดยตรงใน Bash ได้กลายเป็นประเด็นร้อนสำหรับการอภิปรายเกี่ยวกับแนวทางปฏิบัติที่ดีที่สุดในการเขียนสคริปต์และการทำระบบอัตโนมัติ
เกณฑ์ความซับซ้อนของ Shell Script
การสนทนาในชุมชนเผยให้เห็นความรู้สึกร่วมกันในหมู่นักพัฒนา: shell scripts มีขีดจำกัดความซับซ้อนโดยธรรมชาติซึ่งเมื่อเกินขีดจำกัดนี้แล้วจะกลายเป็นสิ่งที่ยุ่งยากและยากต่อการบำรุงรักษา นักพัฒนาหลายคนได้กำหนดกฎส่วนตัวสำหรับการตัดสินใจว่าเมื่อใดควรย้ายจาก Bash ไปยังภาษาที่มีโครงสร้างมากกว่า
กฎของผมมักจะเป็นว่าเมื่อ shell script มีความซับซ้อนมากเกินไป ก็ถึงเวลาที่จะเขียนมันใหม่ในภาษาจริงๆ ไลบรารีนี้เกินเกณฑ์นั้นไปมาก มากทีเดียว
เกณฑ์เหล่านี้แตกต่างกันไปในหมู่นักพัฒนา โดยบางคนแนะนำตัวชี้วัดเฉพาะเช่น มีลูปมากกว่าหนึ่งลูป มีคำสั่ง if มากกว่าหนึ่งคำสั่ง เกิน 100 บรรทัด หรือกำหนดฟังก์ชันมากกว่าสามฟังก์ชัน เป็นสัญญาณว่าถึงเวลาที่จะเปลี่ยนภาษา คนอื่นๆ ชี้ให้เห็นถึงความจำเป็นในการแยกวิเคราะห์อาร์กิวเมนต์หรือโครงสร้างข้อมูลที่ซับซ้อนเป็นตัวบ่งชี้สำคัญ ฉันทามติดูเหมือนจะเป็นว่า shell scripts ควรยังคงเป็นโค้ดเชื่อมต่อที่ค่อนข้างง่าย โดยมอบหมายฟังก์ชันที่ซับซ้อนมากกว่าให้กับภาษาอื่น
เกณฑ์สำหรับนักพัฒนาในการละทิ้งสคริปต์เชลล์
- จำนวนบรรทัด: มากกว่า 100 บรรทัด
- จำนวนฟังก์ชัน: มากกว่าสามฟังก์ชัน
- โครงสร้างการควบคุม: มากกว่าหนึ่งลูป, ลูปซ้อนกัน, หรือคำสั่ง if
- ตัวบ่งชี้ความซับซ้อน:
- ต้องการการแยกวิเคราะห์อาร์กิวเมนต์
- การแยกวิเคราะห์รูปแบบไฟล์
- ไปป์ไลน์ที่ยาวเกิน 80 ตัวอักษร
- โครงสร้างข้อมูลที่ซับซ้อน
ทางเลือกอื่นนอกจาก Bash INI Parser
- Python กับไลบรารีมาตรฐานสำหรับแยกวิเคราะห์ INI
- ยูทิลิตี้ crudini (https://github.com/pixelb/crudini)
- Git สำหรับแยกวิเคราะห์ไฟล์ INI ในสภาพแวดล้อม CI/CD
- ตัวแปลง INI เป็น JSON ด้วย jq (แต่จะสูญเสียคอมเมนต์)
- Perl กับโมดูลเช่น IPC::Run และ Getopt::Declare
- Bun.js กับ shell API ของมัน
Python เป็นทางเลือกที่นิยมมากที่สุด
Python ปรากฏเป็นทางเลือกที่แนะนำมากที่สุดสำหรับ shell scripts ที่ซับซ้อน นักพัฒนาเน้นย้ำถึงไลบรารีมาตรฐานที่มีแบบ batteries included โดยเฉพาะอย่างยิ่งการที่ Python มีตัวแยกวิเคราะห์ไฟล์ INI ในตัวซึ่งขจัดความจำเป็นในการใช้การทำงานที่ซับซ้อนใน Bash ข้อโต้แย้งสำหรับ Python มุ่งเน้นที่ความน่าเชื่อถือที่ดีขึ้น การดีบักได้ง่าย และความอ่านง่ายเมื่อเทียบกับสคริปต์ Bash ที่ซับซ้อน
อย่างไรก็ตาม คำแนะนำให้ใช้ Python มาพร้อมกับข้อควรระวัง นักพัฒนาบางคนชี้ให้เห็นถึงปัญหาความเข้ากันได้ของเวอร์ชัน Python ในอดีต โดยระบบอาจมีเวอร์ชันต่างๆ ที่เข้าถึงได้ผ่านคำสั่งที่แตกต่างกัน คนอื่นๆ กล่าวถึงความท้าทายในการจัดการแพ็คเกจ แม้ว่าเครื่องมือใหม่ๆ เช่น uv และ PEP 723 ซึ่งเป็นเมตาดาต้าสคริปต์แบบอินไลน์ถูกอ้างถึงว่าเป็นทางแก้ปัญหาเหล่านี้
กรณีที่ควรใช้ Shell Scripts
แม้จะมีการผลักดันไปสู่ภาษาที่มีโครงสร้างมากขึ้น นักพัฒนาบางคนก็มีข้อโต้แย้งที่น่าสนใจสำหรับการยึดมั่นกับ shell scripts ในบางสถานการณ์ นักพัฒนาคนหนึ่งปกป้อง shell scripting อย่างเต็มที่ โดยโต้แย้งว่าคำวิจารณ์มักเกิดจากความไม่ลงรอยกันระหว่างกระบวนทัศน์การเขียนโปรแกรมกับภาษา พวกเขาแนะนำว่า shell scripts เหมาะอย่างยิ่งในการดำเนินการตามลำดับขั้นตอนและสามารถบำรุงรักษาได้เมื่อจัดระเบียบอย่างเหมาะสมด้วยการออกแบบที่เน้นข้อมูลเป็นหลัก
ข้อได้เปรียบที่สำคัญอีกประการที่กล่าวถึงคือความยั่งยืนและความเข้ากันได้ Shell scripts ที่เขียนขึ้นเมื่อหลายทศวรรษที่แล้วมักสามารถทำงานบนระบบสมัยใหม่ได้โดยมีการแก้ไขเพียงเล็กน้อย ซึ่งให้ความคงทนที่โดดเด่นเมื่อเทียบกับภาษาอื่นๆ ที่อาจเผชิญกับการเปลี่ยนแปลงที่ทำให้เกิดความไม่เข้ากันหรือปัญหาการพึ่งพาในระยะยาว
ข้อจำกัดในโลกแห่งความเป็นจริง
การอภิปรายยังยอมรับความเป็นจริงในทางปฏิบัติที่บางครั้งจำเป็นต้องใช้โซลูชันเช่น Bash INI Parser ผู้มีส่วนร่วมคนหนึ่งกล่าวถึงการรับช่วงต่อโปรเจกต์เก่าที่มี shell scripts มากกว่า 50,000 บรรทัดซึ่งจำเป็นต้องแยกวิเคราะห์ไฟล์ INI และโหลดค่าลงในตัวแปรสภาพแวดล้อมอย่างกะทันหัน—ซึ่งเป็นกรณีการใช้งานที่ไลบรารีนี้ตอบโจทย์พอดี
มีการแนะนำวิธีการทางเลือกหลายวิธี รวมถึงการใช้เครื่องมือที่มีอยู่แล้วเช่น crudini การใช้ประโยชน์จาก Git (ซึ่งมักมีอยู่ในสภาพแวดล้อม CI/CD) เพื่อแยกวิเคราะห์ไฟล์ INI หรือการสร้างตัวแปลง INI เป็น JSON และใช้ jq สำหรับการจัดการ—แม้ว่าวิธีการหลังนี้จะสูญเสียความคิดเห็นในไฟล์ INI
การถกเถียงในที่สุดก็เน้นให้เห็นถึงความตึงเครียดระหว่างแนวทางปฏิบัติที่ดีที่สุดในทางทฤษฎีกับข้อจำกัดในทางปฏิบัติในการพัฒนาซอฟต์แวร์ ในขณะที่นักพัฒนาส่วนใหญ่เห็นพ้องกันว่าการแยกวิเคราะห์การกำหนดค่าที่ซับซ้อนใน Bash ข้ามเกณฑ์ความซับซ้อนที่เหมาะสม พวกเขาก็ตระหนักว่าโปรเจกต์ในโลกแห่งความเป็นจริงบางครั้งต้องการการประนีประนอมในทางปฏิบัติ
สำหรับผู้ที่ต้องทำงานกับไฟล์ INI ใน shell scripts Bash INI Parser เสนอโซลูชันที่ครอบคลุม—แต่การมีอยู่ของมันเองก็เป็นเครื่องเตือนใจถึงการอภิปรายที่ดำเนินอยู่เกี่ยวกับว่าเมื่อใดควรเปลี่ยนไปใช้เครื่องมือการเขียนโปรแกรมที่แข็งแกร่งกว่า
อ้างอิง: Bash INI Parser