PlusMagi's Blog By Pitt Phunsanit automation,Backend,CI/CD,Shell Script วิธีตั้งค่าและเขียนไฟล์ .shellcheckrc สำหรับโปรเจกต์ขนาดใหญ่

วิธีตั้งค่าและเขียนไฟล์ .shellcheckrc สำหรับโปรเจกต์ขนาดใหญ่

ไฟล์ .shellcheckrc คือไฟล์กำหนดค่าคอนฟิกส่วนกลาง (Configuration file) ของ ShellCheck ช่วยให้ทีมพัฒนาไม่ต้องใส่คอมเมนต์ # shellcheck disable=... หรือส่งแฟล็กคำสั่งซ้ำๆ ในทุกไฟล์ ทำให้กฎเกณฑ์โค้ดมีความสม่ำเสมอเท่าเทียมกันทั้งโปรเจกต์และบน CI/CD Pipeline


ลำดับการค้นหาไฟล์คอนฟิก (Search Hierarchy)

เมื่อ ShellCheck เริ่มทำงาน จะค้นหาไฟล์ตามลำดับดังนี้

  1. ไฟล์ที่ระบุผ่านแฟล็กคำสั่งโดยตรง: --rcfile=/path/to/.shellcheckrc
  2. ไดเรกทอรีปัจจุบันที่รันคำสั่ง (Root ของโปรเจกต์)
  3. ไดเรกทอรีด้านบนขึ้นไปเรื่อยๆ จนถึง Root filesystem
  4. ไดเรกทอรี Home ของผู้ใช้: ~/.shellcheckrc

สำหรับโปรเจกต์ระดับองค์กรหรือ Monorepo ควารวางไฟล์ไว้ที่ Root ของ Git Repository เสมอ


โครงสร้างและ Directive สำคัญใน .shellcheckrc

ไวยากรณ์ของไฟล์เป็นรูปแบบบรรทัดละคำสั่ง ใช้เครื่องหมาย # สำหรับคอมเมนต์:

Ini, TOML

# ==============================================================================
# Global ShellCheck Configuration for Enterprise Project
# ==============================================================================

# 1. กำหนด Shell เริ่มต้นกรณีไฟล์ไม่มี Shebang
# ค่าที่รองรับ: sh, bash, dash, ksh
shell=sh

# 2. ระดับความรุนแรงขั้นต่ำที่จะนำมาแจ้งเตือน
# ค่าที่รองรับ: error, warning, info, style
severity=style

# 3. เปิดใช้งาน Optional Checks (กฎตรวจสอบความปลอดภัยขั้นสูง)
enable=check-unassigned-uppercase
enable=require-variable-braces

# 4. ละเว้นกฎที่ไม่ต้องการบังคับใช้ทั้งโปรเจกต์ (คั่นด้วย comma)
# SC1090: Can't follow non-constant source.
# SC1091: Not following sourced file (เช่นไฟล์ที่ดึงมาจาก dynamic path)
# SC2034: Variable appears unused (กรณีไฟล์เป็น config template)
disable=SC1090,SC1091

# 5. อนุญาตให้ ShellCheck เดินตามอ่านไฟล์ที่มีการใช้ 'source' หรือ '.'
external-sources=true

# 6. กำหนดไดเรกทอรีต้นทางสำหรับคำสั่ง source (Source Path)
source-path=SCRIPTDIR
source-path=./scripts/lib


รายละเอียดการตั้งค่าที่เหมาะกับงานระดับโปรดักชัน

1. การเปิด Optional Checks (enable=...)
ShellCheck มีกฎพิเศษที่ไม่ได้เปิดทำงานเป็นค่าเริ่มต้น แต่มีประโยชน์มากในโปรเจกต์ขนาดใหญ่

  • enable=check-unassigned-uppercase: ตรวจจับตัวแปรตัวพิมพ์ใหญ่ที่ถูกเรียกใช้แต่ไม่เคยถูกเซ็ตค่า (ป้องกันการสะกด Environment Variable ผิด)
  • enable=require-variable-braces: บังคับให้เขียนตัวแปรในรูปแบบ ${VAR} เสมอ เพื่อลดความผิดพลาดในการต่อสตริง
  • enable=avoid-nullary-conditions: เตือนเมื่อเขียนเงื่อนไข [ "$var" ] เปล่าๆ โดยไม่ระบุแฟล็ก -n หรือ -z ให้ชัดเจน

2. การจัดการไฟล์ที่ถูก source (source-path และ external-sources)
ในโปรเจกต์ใหญ่ สคริปต์มักจะแยกเป็นโมดูลย่อย เช่น ./lib/common.sh:

Ini, TOML

external-sources=true
source-path=SCRIPTDIR
source-path=lib

  • SCRIPTDIR: ตัวแปรพิเศษบอกให้ ShellCheck ค้นหาไฟล์ที่ถูก include จากไดเรกทอรีที่สคริปต์ตัวนั้นวางอยู่ ไม่ใช่ไดเรกทอรีที่รันเทอร์มินัล

3. การคัดกรองเฉพาะระดับความรุนแรง (severity=...)

  • ในช่วงเริ่มต้นวางระบบกับ Codebase เก่า (Legacy): ตั้งเป็น severity=error หรือ warning เพื่อไม่ให้บิลด์ล้มจากจุดเล็กน้อย
  • โปรเจกต์ใหม่หรือ Codebase ที่ควบคุมเข้มงวด: ตั้งเป็น severity=style หรือ info

การทดสอบและประยุกต์ใช้งานจริง

1. ตรวจสอบว่า ShellCheck โหลดคอนฟิกถูกต้อง รันคำสั่งพร้อมแฟล็กตรวจสอบ

shellcheck --rcfile=.shellcheckrc deploy.sh

2. ตัวอย่างการรันสแกนทั้ง Repository ใน Local / Makefile

Makefile

.PHONY: lint-scripts
lint-scripts:
	find . -type f -name "*.sh" -not -path "./vendor/*" -not -path "./.git/*" | xargs shellcheck

3. การใช้งานร่วมกับ Super-Linter หรือ CI Pipeline เมื่อใส่ .shellcheckrc ไว้ที่ Root ของ Repository เครื่องมือ CI ทั่วไป (เช่น GitHub Actions, GitLab CI, Bitbucket Pipelines) จะตรวจพบและนำไปปรับใช้กับทุกไฟล์สคริปต์ใน Commit โดยอัตโนมัติ


Exit mobile version