Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม Bash

ShellCheck: ตรวจจับและแก้ไขข้อผิดพลาดสคริปต์ Bash ด้วยคำเตือนและคำแนะนำแบบเรียลไทม์

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;
ShellCheck: ตรวจจับและแก้ไขข้อผิดพลาดสคริปต์ Bash ด้วยคำเตือนและคำแนะนำแบบเรียลไทม์

จากภาพหน้าจอข้างต้น ตัวแปรสองตัวแรก 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: ตรวจจับและแก้ไขข้อผิดพลาดสคริปต์ Bash ด้วยคำเตือนและคำแนะนำแบบเรียลไทม์

ใช้ 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 แล้ว ภาพหน้าจอต่อไปนี้แสดงการทำงานโดยใช้สคริปต์เดียวกันข้างต้น

ShellCheck: ตรวจจับและแก้ไขข้อผิดพลาดสคริปต์ Bash ด้วยคำเตือนและคำแนะนำแบบเรียลไทม์

หากคุณได้ข้อผิดพลาดหลังทำตามขั้นตอนข้างต้น แสดงว่าคุณอาจไม่ได้ติดตั้ง 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 แชร์ความคิดเห็นกับเราผ่านส่วนความคิดเห็นด้านล่างครับ

คุณรู้จักเครื่องมืออื่นๆ ที่คล้ายกันไหม? หากรู้ ให้แชร์ข้อมูลเกี่ยวกับพวกมันในความคิดเห็นด้วยครับ