ไฟล์ .shellcheckrc คือไฟล์กำหนดค่าคอนฟิกส่วนกลาง (Configuration file) ของ ShellCheck ช่วยให้ทีมพัฒนาไม่ต้องใส่คอมเมนต์ # shellcheck disable=... หรือส่งแฟล็กคำสั่งซ้ำๆ ในทุกไฟล์ ทำให้กฎเกณฑ์โค้ดมีความสม่ำเสมอเท่าเทียมกันทั้งโปรเจกต์และบน CI/CD Pipeline
ลำดับการค้นหาไฟล์คอนฟิก (Search Hierarchy)
เมื่อ ShellCheck เริ่มทำงาน จะค้นหาไฟล์ตามลำดับดังนี้
- ไฟล์ที่ระบุผ่านแฟล็กคำสั่งโดยตรง:
--rcfile=/path/to/.shellcheckrc - ไดเรกทอรีปัจจุบันที่รันคำสั่ง (Root ของโปรเจกต์)
- ไดเรกทอรีด้านบนขึ้นไปเรื่อยๆ จนถึง Root filesystem
- ไดเรกทอรี 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 โดยอัตโนมัติ