เมื่อ Shell Scripts ซับซ้อนเกินไป: การถกเถียงเรื่อง Bash INI Parser

BigGo Editorial Team
เมื่อ Shell Scripts ซับซ้อนเกินไป: การถกเถียงเรื่อง Bash INI Parser

การเปิดตัวไลบรารี 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