5 คะแนน โดย GN⁺ 2023-11-25 | 1 ความคิดเห็น | แชร์ทาง WhatsApp

แนะนำ ShellCheck

  • ShellCheck เป็นเครื่องมือสำหรับค้นหาบั๊กในเชลล์สคริปต์
  • สามารถติดตั้งได้ในเครื่องผ่าน cabal, apt, dnf, pkg, brew
  • เมื่อนำสคริปต์มาวาง ShellCheck จะแสดงผลการวิเคราะห์

คุณสมบัติของ ShellCheck

  • ShellCheck ใช้งานได้อย่างอิสระภายใต้ไลเซนส์ GPLv3
  • มีเอกสารอยู่ใน ShellCheck Wiki และสามารถดูซอร์สโค้ดได้บน GitHub
  • โดยมากถูกแพ็กเกจไว้แล้วในดิสทริบิวชันหรือแพ็กเกจเมเนเจอร์ส่วนใหญ่
  • รองรับเป็นลินเตอร์แบบบูรณาการในเอดิเตอร์หลัก ๆ และสามารถตรวจสอบโค้ดใน GitHub repository โดยอัตโนมัติผ่าน CodeClimate, Codacy, CodeFactor
  • เขียนด้วยภาษา Haskell จึงเหมาะกับผู้ใช้ที่สนใจภาษานี้

คำขอบคุณ

  • ขอขอบคุณเป็นพิเศษต่อ GitHub Sponsors: Gitpod, Mercedes-Benz, BashSupport Pro, per1234, WhitewaterFoundry, cavcrosby, dcminter, photostructure, Cronitor, djdefi, steve-chavez เป็นต้น

ความเห็นของ GN⁺

  • ประเด็นสำคัญที่สุดของบทความนี้คือ ShellCheck เป็นเครื่องมือที่มีประโยชน์สำหรับการค้นหาบั๊กในเชลล์สคริปต์
  • ShellCheck ใช้งานฟรี รองรับหลายแพลตฟอร์มและเอดิเตอร์ และใช้งานง่าย ซึ่งอาจน่าสนใจสำหรับผู้คน
  • โดยเฉพาะอย่างยิ่ง การสนับสนุนจากชุมชนโอเพนซอร์สและการที่พัฒนาด้วยภาษา Haskell อาจทำให้ซอฟต์แวร์นี้น่าดึงดูดสำหรับนักพัฒนา

1 ความคิดเห็น

 
GN⁺ 2023-11-25
ความคิดเห็นจาก Hacker News
  • ข้อควรระวังในการเขียนสคริปต์

    • แนะนำให้ใช้ตัวเลือก -u (nounset) เพื่อให้เกิดข้อผิดพลาดเมื่อมีการใช้ตัวแปรที่ยังไม่ได้ประกาศ โดยมีข้อยกเว้นคือกรณีที่การขยายอาร์เรย์ทำให้อาร์เรย์ว่างถูกมองว่าเป็น unbound
    • สามารถลองทำ dry-run โดยใช้ตัวเลือก -n (noexec) เพื่อป้องกันการรันคำสั่งจริง
    • ตัวเลือก -e (errexit) ก็มีประโยชน์เช่นกัน แต่ต้องระวังว่ามีเพียงคำสั่ง "naked" ที่ล้มเหลวเท่านั้นที่จะทำให้สคริปต์จบการทำงาน จึงมักเลือกเพิ่ม || fail "..." ต่อท้ายคำสั่งเพื่อหลีกเลี่ยงปัญหานี้
  • การค้นพบช่องโหว่ในเชลล์สคริปต์

    • พบช่องโหว่การยกระดับสิทธิ์ผ่าน arithmetic expansion ตัวอย่างเช่น หากควบคุม $ENV_VAR ได้ ก็สามารถฉีดโค้ดผ่าน $((1 + ENV_VAR)) ได้
    • Shellcheck ตรวจจับสิ่งนี้ไม่ได้ในการตั้งค่าเริ่มต้น ดังนั้นหากต้องทำฟังก์ชันที่สำคัญด้านความปลอดภัย ก็ไม่ควรใช้เชลล์
  • Shellcheck และ strictbash

    • Shellcheck มีประโยชน์มาก
    • strictbash เป็น wrapper ที่รัน Shellcheck ก่อนรันสคริปต์ และถ้ามีข้อผิดพลาดก็จะไม่ยอมให้รันสคริปต์ นอกจากนี้ยังตั้งค่าแฟล็ก Bash "strict mode" ทั้งหมดด้วย
  • การกล่าวถึง Shellcheck

    • มีการพูดถึง Shellcheck อยู่มาก และการถกเถียงขนาดใหญ่ครั้งล่าสุดเกิดขึ้นในปี 2021
  • การใช้ Haskell และ Turtle

    • ใช้ Haskell แปลง deployment script โดยใช้ร่วมกับไลบรารี Turtle ทำให้ลดความซ้ำซ้อนได้มาก
    • ผลลัพธ์คือโค้ดสั้นลงมาก
  • การใช้ Shellcheck และ linter

    • ยึดหลักว่า "จะแก้ทุกคำเตือนให้หมดก่อนคอมมิต" และใส่ Shellcheck กับ linter อื่น ๆ ไว้ใน pre-commit
    • เชลล์สคริปต์ส่วนใหญ่อยู่ในไฟล์ .gitlab-ci.yml ทำให้ตรวจสอบได้ยาก จึงสร้าง wrapper สำหรับตรวจอัตโนมัติขึ้นมา
  • Bash language server

    • มี Bash language server อยู่ด้วย
  • ผลด้านการเรียนรู้จาก Shellcheck

    • ตอนที่ใช้ Shellcheck ตรวจ production /bin/sh script ตัวแรก ก็ได้เรียนรู้อะไรใหม่ ๆ แม้จะเขียนสคริปต์มาตั้งแต่ยุค 80s แล้วก็ตาม
  • คำแนะนำให้ใช้ Bach

    • เมื่อจำเป็นต้องใช้ Bash ก็แนะนำให้ใช้ Bach เพราะการใช้ Bash กับงานที่ยาวพอสมควรอาจไม่เหมาะสม
  • Shellcheck กับการจัดการ source/import

    • Shellcheck ยอดเยี่ยมมาก แต่การจัดการ source หรือ import นั้นยุ่งยากมาก ซึ่งเป็นปัญหาที่เกิดจาก sh เหมือนฝันร้าย