ShellCheck เป็นเครื่องมือวิเคราะห์แบบคงที่ (static analysis tool) ที่แสดงคำเตือนและข้อเสนอแนะเกี่ยวกับโค้ดที่ไม่ดีในสคริปต์เชลล์ bash/sh สามารถใช้ได้หลายวิธี: จากเว็บโดยวางสคริปต์เชลล์ของคุณในโปรแกรมแก้ไขออนไลน์ (Ace — โปรแกรมแก้ไขโค้ดสแตนด์อโลนเขียนด้วย JavaScript) ที่ https://www.shellcheck.net (มันถูกซิงโครไนซ์กับคอมมิต git ล่าสุดเสมอ และเป็นวิธีที่ง่ายที่สุดในการลอง ShellCheck) เพื่อรับข้อคิดเห็นทันที
ทางเลือกอื่น คุณสามารถติดตั้งบนเครื่องของคุณและรันจากเทอร์มินัล รวมเข้ากับโปรแกรมแก้ไขข้อความของคุณ וכן ในชุดสร้าง (build) หรือชุดทดสอบ (test suites) ของคุณ
มีสามสิ่งหลักที่ ShellCheck ทำ:
- ชี้ให้เห็นและอธิบายปัญหาไวยากรณ์ทั่วไปของผู้เริ่มต้นที่ทำให้เชลล์ให้ข้อความข้อผิดพลาดที่เข้าใจยาก
- ชี้ให้เห็นและอธิบายปัญหาเชิงความหมาย (semantic) ระดับกลางทั่วไปที่ทำให้เชลล์ทำงานแปลกและตรงข้ามกับ直觉
- ชี้ให้เห็นข้อผิดพลาดที่ซับซ้อน กรณีขอบ (corner cases) และหลุมพรางที่อาจทำให้สคริปต์ที่ทำงานได้ของผู้ใช้ขั้นสูงล้มเหลวภายใต้สภาพแวดล้อมในอนาคต
ในบทความนี้ เราจะแสดงวิธีติดตั้งและใช้ ShellCheck ในวิธีต่างๆ เพื่อหาบั๊กหรือโค้ดที่ไม่ดีในสคริปต์เชลล์ของคุณใน Linux
วิธีติดตั้งและใช้ ShellCheck ใน Linux
ShellCheck สามารถติดตั้งในเครื่องได้ง่ายผ่านตัวจัดการแพ็กเกจ ดังนี้
บน Debian/Ubuntu
# apt-get install shellcheck
บน RHEL/CentOS
# yum -y install epel-release # yum install ShellCheck
บน Fedora
# dnf install ShellCheck
เมื่อติดตั้ง ShellCheck แล้ว มาดูวิธีใช้ ShellCheck ในวิธีต่างๆ ที่เรากล่าวมาก่อนหน้านี้
ใช้ ShellCheck จากเว็บ
ไปที่ https://www.shellcheck.net และวางสคริปต์ของคุณในโปรแกรมแก้ไข Ace ที่ให้ไว้ คุณจะเห็นผลลัพธ์ที่ด้านล่างของโปรแกรมแก้ไข ตามที่แสดงในภาพหน้าจอด้านล่าง
ในตัวอย่างต่อไปนี้ สคริปต์เชลล์ทดสอบประกอบด้วยบรรทัดต่อไปนี้:
#!/bin/bash #declare variables MINARGS=2 E_NOTROOT=50 E_MINARGS=100 #echo values of variables echo $MINARGS echo $E_NONROOT exit 0;
จากภาพหน้าจอข้างต้น ตัวแปรสองตัวแรก E_NOTROOT และ E_MINARGS ถูกประกาศแต่ไม่ได้ใช้งาน ShellCheck รายงานว่าเป็น "suggestive errors":
SC2034: E_NOTROOT appears unused. Verify it or export it. SC2034: E_MINARGS appears unused. Verify it or export it.
ثانيًا ในคำสั่ง echo $E_NONROOT ใช้ชื่อผิด (ควรเป็น E_NOTROOT) นั่นคือเหตุผลที่ ShellCheck แสดงข้อผิดพลาด:
SC2153: Possible misspelling: E_NONROOT may not be assigned, but E_NOTROOT is
อีกครั้ง เมื่อดูคำสั่ง echo ตัวแปรไม่ได้ถูกปิดล้อมด้วยเครื่องหมายคำพูดคู่ (ช่วยป้องกัน globbing และ word splitting) ดังนั้น Shell Check แสดงคำเตือน:
SC2086: Double quote to prevent globbing and word splitting.
ใช้ ShellCheck จากเทอร์มินัล
คุณยังสามารถรัน ShellCheck จากบรรทัดคำสั่งได้ เราจะใช้สคริปต์เชลล์เดียวกันข้างต้นดังนี้:
$ shellcheck test.sh
ใช้ ShellCheck จากโปรแกรมแก้ไขข้อความ
คุณยังสามารถดูข้อเสนอแนะและคำเตือนของ ShellCheck โดยตรงในโปรแกรมแก้ไขหลายตัว นี่อาจเป็นวิธีที่มีประสิทธิภาพมากกว่าในการใช้ ShellCheck เมื่อคุณบันทึกไฟล์ มันจะแสดงข้อผิดพลาดในโค้ดทันที
ใน Vim ใช้ ALE หรือ Syntastic (เราจะใช้ตัวนี้):
เริ่มต้นด้วยการติดตั้ง Pathogen เพื่อให้ง่ายต่อการติดตั้ง syntastic รันคำสั่งด้านล่างเพื่อได้ไฟล์ pathogen.vim และไดเรกทอรีที่ต้องการ:
# mkdir -p ~/.vim/autoload ~/.vim/bundle && curl -LSso ~/.vim/autoload/pathogen.vim https://tpo.pe/pathogen.vim
จากนั้นเพิ่มนี้ในไฟล์ ~/.vimrc ของคุณ:
execute pathogen#infect()
เมื่อคุณติดตั้ง pathogen แล้ว ตอนนี้คุณสามารถใส่ syntastic ลงใน ~/.vim/bundle ได้ดังนี้:
# cd ~/.vim/bundle && git clone --depth=1 https://github.com/vim-syntastic/syntastic.git
ต่อไป ปิด vim และเปิดใหม่เพื่อโหลดใหม่ แล้วพิมพ์คำสั่งด้านล่าง:
:Helptags
หากทุกอย่าง顺利 คุณควรจะมี ShellCheck รวมกับ Vim แล้ว ภาพหน้าจอต่อไปนี้แสดงการทำงานโดยใช้สคริปต์เดียวกันข้างต้น
หากคุณได้ข้อผิดพลาดหลังทำตามขั้นตอนข้างต้น แสดงว่าคุณอาจไม่ได้ติดตั้ง Pathogen ถูกต้อง ลองทำซ้ำขั้นตอนแต่ให้แน่ใจว่าคุณทำดังนี้:
- สร้างไดเรกทอรี ~/.vim/autoload และ ~/.vim/bundle ทั้งคู่
- เพิ่มบรรทัด execute pathogen#infect() ในไฟล์ ~/.vimrc ของคุณ
- ทำ git clone ของ syntastic ภายใน ~/.vim/bundle
- ใช้สิทธิ์ที่เหมาะสมเพื่อเข้าถึงไดเรกทอรีทั้งหมดข้างต้น
คุณยังสามารถใช้โปรแกรมแก้ไขอื่นๆ เพื่อตรวจสอบโค้ดที่ไม่ดีในสคริปต์เชลล์ได้ เช่น:
- ใน Emacs ใช้ Flycheck
- ใน Sublime ใช้ SublimeLinter
- ใน Atom ใช้ Linter
- ในโปรแกรมแก้ไขส่วนใหญ่ ใช้ GCC error compatibility
หมายเหตุ: ใช้แกลเลอรีโค้ดที่ไม่ดีเพื่อดำเนินการ ShellChecking เพิ่มเติม
ShellCheck Github Repository: https://github.com/koalaman/shellcheck
ขอจบเพียงเท่านี้! ในบทความนี้ เราแสดงวิธีติดตั้งและใช้ ShellCheck เพื่อหาบั๊กหรือโค้ดที่ไม่ดีในสคริปต์เชลล์ของคุณใน Linux แชร์ความคิดเห็นกับเราผ่านส่วนความคิดเห็นด้านล่างครับ
คุณรู้จักเครื่องมืออื่นๆ ที่คล้ายกันไหม? หากรู้ ให้แชร์ข้อมูลเกี่ยวกับพวกมันในความคิดเห็นด้วยครับ