ค้นหาเว็บไซต์

หยุดไว้วางใจสคริปต์เชลล์ของคุณ: ทำไม ShellCheck ถึงเป็นเครื่องมือที่คุณขาดหาย


ShellCheck เป็นโปรแกรมตรวจสอบโค้ดที่สามารถตรวจจับบั๊ก ความเข้ากันไม่ได้ และปัญหาอื่น ๆ ในสคริปต์เชลล์ มันมีคุณค่าเพราะมีเครื่องมือที่คล้ายกันเพียงไม่กี่ตัว และการเขียนโปรแกรมเชลล์สามารถมีความไม่เสถียรโดยเฉพาะ มีความกังวลเกี่ยวกับความพกพาและการเปลี่ยนแปลงไวยากรณ์ต่าง ๆ ที่เกิดขึ้นตามเวลา

ฉันใช้ ShellCheck ตรวจสอบสคริปต์ของตัวเอง—และสคริปต์จากบุคคลที่สามไม่กี่อัน—และก็ไม่แปลกใจเลยที่มันพบปัญหาอยู่หลายอย่าง ดังนั้นฉันขอแนะนำให้คุณทำแบบเดียวกัน!

ShellCheck คืออะไร?

เครื่องมือวิเคราะห์สคริปต์เชลล์แบบสแตติก (และเว็บไซต์)

ShellCheck แนะนำตัวเองว่าเป็น “เครื่องมือวิเคราะห์สคริปต์เชลล์แบบสถิต” ซึ่งหมายความว่าคุณสามารถรันมันในเทอร์มินัล และมันจะบอกคุณว่าสคริปต์เชลล์ของคุณดีแค่ไหน โดยเฉพาะอย่างยิ่ง มันทำงานเพียงแค่ดูที่ซอร์สโค้ดของสคริปต์ของคุณ ไม่ใช่โดยการรันจริง

โปรแกรมจะแจ้งเตือนคุณเกี่ยวกับปัญหาต่างๆ ในโค้ดของคุณ รวมถึง:

  • ข้อผิดพลาดทางไวยากรณ์และปัญหา
  • ข้อผิดพลาดทางความหมายทั่วไป
  • ความไม่เข้ากัน
  • ปัญหาด้านสไตล์ที่อาจไม่ก่อให้เกิดปัญหา แต่สามารถทำให้โค้ดอ่านยากขึ้น

ตัวอย่างเช่น นี่คือตัวสคริปต์เชลล์ขนาดเล็ก repeat.sh ซึ่งพิมพ์อาร์กิวเมนต์ตัวแรกของมัน:

#!/bin/bash
echo $1

คุณอาจคิดว่าไม่มีอะไรผิดพลาดได้มากนักกับสคริปต์ที่ง่ายเช่นนี้ แต่ ShellCheck จะช่วยแก้ไขความเข้าใจผิดนั้น:

คุณใช้มันอย่างไร?

มีทั้งเวอร์ชันแบบบรรทัดคำสั่งและเว็บ

สำหรับการเริ่มต้น ShellCheck มีเว็บแอปที่ยอดเยี่ยมซึ่งสะท้อนเวอร์ชันล่าสุดของโค้ดและให้คุณลองใช้งานได้โดยไม่ต้องติดตั้งอะไรเลย ฉันไม่แนะนำให้ใช้มันในระยะยาวเพราะมันสะดวกน้อยกว่ามาก แต่เป็นวิธีที่ยอดเยี่ยมในการทดสอบซอฟต์แวร์และดูว่ามันทำอะไรได้บ้าง

เนื่องจากเวอร์ชันท้องถิ่นของคุณอาจไม่ใช่เวอร์ชันล่าสุดที่สุด คุณอาจเห็นความแตกต่างระหว่างเวอร์ชันนั้นกับเวอร์ชันเว็บ ตรวจสอบให้แน่ใจว่าคุณใช้ตัวจัดการแพ็กเกจของคุณเพื่อให้เวอร์ชันท้องถิ่นของคุณเป็นปัจจุบัน

หากคุณตัดสินใจที่จะลองใช้ ShellCheck จริง ๆ ให้เริ่มจากคำแนะนำการติดตั้งสำหรับแพลตฟอร์มของคุณ บน Debian/Ubuntu ใช้ sudo apt install shellcheck; บน Fedora ใช้ dnf install ShellCheck หากคุณมี Homebrew ให้รัน brew install shellcheck

เมื่อมันถูกติดตั้งแล้ว คุณสามารถเรียกใช้เครื่องมือด้วยคำสั่ง shellcheck โดยถ้าไม่ใส่อาร์กิวเมนต์ใด ๆ คุณจะได้รับข้อมูลการใช้งาน:

ตอนนี้ลองเรียกใช้ shellcheck กับไฟล์สคริปต์เพื่อดูผลลัพธ์ที่มีประโยชน์ เช่น:

shellcheck script.sh

ถ้าสคริปต์ของคุณมีปัญหาใด ๆ คุณควรสังเกตว่า ShellCheck ให้ข้อมูลที่มีประโยชน์หลายอย่าง เริ่มแรก มันจะอธิบายแต่ละปัญหาที่มันพบ พร้อมกับชื่อไฟล์ หมายเลขบรรทัด และตำแหน่งเฉพาะในบรรทัด เช่น:

“SC2086” เป็นรหัสข้อผิดพลาดเฉพาะที่ ShellCheck ใช้อ้างอิง รายการรหัสทั้งหมดมากกว่า 500 รหัสสามารถดูได้ในวิกิของ ShellCheck

นอกจากข้อความแสดงข้อผิดพลาดเฉพาะแล้ว ShellCheck ยังเสนอทางเลือกที่แนะนำ พร้อมกับชุดลิงก์อ้างอิงที่ส่วนท้ายของแต่ละปัญหาเฉพาะ หน้าเหล่านี้ให้รายละเอียดมากขึ้น รวมถึงสาเหตุที่ผู้คนอาจทำผิดพลาดบางอย่าง และว่ายกเว้นกฎหรือไม่

ShellCheck มีตัวเลือกสองสามตัวที่คุณสามารถใช้เพื่อปรับแต่งวิธีการทํางาน ตัวเลือก --format=json จะให้ผลลัพธ์ในรูปแบบที่มีโครงสร้างมากขึ้น เมื่อใช้ --severity=error คุณจะได้รับรายงานข้อผิดพลาดเท่านั้น ลักษณะ ข้อมูล และชนิดคําเตือนจะถูกละเว้น และตัวเลือก --include= และ --exclude= สามารถตามด้วยรายการรหัสเฉพาะที่คั่นด้วยจุลภาคเพื่อปรับแต่งขอบเขต คุณสามารถละเว้น "SC" นําหน้าได้หากต้องการ

ShellCheck สามารถตรวจพบปัญหาประเภทใดได้บ้าง?

วิธีที่ดีที่สุดในการหาคำตอบคือการลองทำมัน

หลายสิ่งหลายอย่างอาจผิดพลาดได้กับสคริปต์เชลล์ สคริปต์เชลล์มักจะถูกตีความ และภาษามักจะให้อภัย โดยมีการพิมพ์ชนิดข้อมูลที่หยาบหรือแทบไม่มีเลย มีความแตกต่างทางไวยากรณ์มากมายระหว่างเวอร์ชันต่างๆ และไวยากรณ์ทางเลือกยังคงได้รับการดูแลเพื่อให้สามารถเข้ากันได้กับเวอร์ชันเก่า นอกจากนี้ยังมีเชลล์ที่แตกต่างกัน เช่น Bash และ Zsh ซึ่งสามารถใช้แทนกันได้มากหรือน้อย แต่ยังคงมีความแตกต่างบางอย่างอยู่

ShellCheck มีเป้าหมายเพื่อค้นหาปัญหาเหล่านี้ทั้งหมด ดังนั้นมันจึงค่อนข้างครอบคลุม นี่คือตัวอย่างจากสคริปต์เชลล์ของฉันเอง:

นี่เน้นถึงปัญหาที่พบได้บ่อยมาก: การใช้ไวยากรณ์เก่า แม้ว่าไวยากรณ์ backtick (``) จะสามารถใช้แทนคำสั่งได้ แต่มันไม่เหมาะสม; อย่างหนึ่งคือมันไม่อนุญาตให้คำสั่งซ้อนกันได้ รุ่นที่ทันสมัยกว่า $ (...) เป็นไปตามมาตรฐาน POSIX ดังนั้นจึงไม่มีเหตุผลดี ๆ ที่จะหลีกเลี่ยงการใช้มัน

ShellCheck ยังจับการใช้งาน $0 แบบไม่ใส่เครื่องหมายคำพูดของฉันด้วย ตามที่ข้อความข้อมูลอธิบาย สิ่งนี้ช่วยป้องกันการขยายค่าที่ฉันอาจไม่คาดคิด ปัญหาสองเรื่องนี้เป็นเรื่องของสไตล์ ดังนั้นจึงไม่ค่อยน่าเป็นห่วงนัก แต่การค้นหาครั้งต่อไปนั้นร้ายแรงกว่า:

นี่เป็นคำเตือนจริง—สังเกตความแตกต่างเล็กน้อยของสี—เพราะมันเปิดเผยความเข้าใจผิดพื้นฐาน: ลำดับของ 2>&1 และการเปลี่ยนทิศทางอื่น ๆ เป็นสิ่งสำคัญ เวอร์ชันที่ผิดของฉันยังคงแสดงข้อผิดพลาดบนบรรทัดคำสั่งอยู่ แม้ว่าฉันจะเปลี่ยนทาง stdout ไปที่ /dev/null เพราะลำดับของมัน

นี่คือปัญหาประเภทที่ยากต่อการสังเกต: มันไม่ควรเกิดขึ้นในระหว่างการทำงานปกติของโปรแกรม และมันอาจจะเป็นสิ่งที่ฉันตั้งใจไว้ก็ได้ แต่มันไม่น่าจะเกิดขึ้น โชคดีที่ ShellCheck ฉลาดพอที่จะเตือนฉันเกี่ยวกับโค้ดที่ถูกต้องทางเทคนิคแต่แปลกนี้!

เพื่อทำให้ตัวเองรู้สึกดีขึ้นเล็กน้อย ฉันได้ตรวจสอบสคริปต์เชลล์บางส่วนที่โปรเจกต์สาธารณะและโอเพ่นซอร์สใช้ โชคดีสำหรับฉันที่ฉันไม่ได้เป็นคนเดียวที่สร้างสคริปต์เชลล์แบบลวกๆ รายงานสำหรับเครื่องมือ bashblog ที่ยอดเยี่ยมระบุปัญหามากมาย มันเป็นสคริปต์ที่ใหญ่กว่ามากแน่นอน แต่ช่วยสาธิตปัญหาที่ ShellCheck สามารถตรวจจับได้







คุณภาพของสคริปต์เชลล์ของคุณก็สำคัญเช่นกัน

เนื่องจากสคริปต์เชลล์มักเป็นเรื่องส่วนตัวหรือเขียนขึ้นเพื่อทำงานชั่วคราว จึงง่ายที่จะประมาทและพลาดปัญหาที่สำคัญ แม้กระทั่งบั๊ก แต่เราควรดูแลสคริปต์เชลล์ด้วยความเอาใจใส่เท่ากับโปรแกรมประเภทอื่น ๆ

สคริปต์เชลสามารถเปลี่ยนแปลงได้ตามเวลา ใช้ในวัตถุประสงค์ที่ไม่ได้ตั้งใจตั้งแต่แรก คุณไม่มีทางรู้ว่าโค้ดของคุณจะไปจบลงที่ไหน หรือใครอาจจะใช้มันในวันหนึ่ง ดังนั้นให้แน่ใจว่ามันปลอดภัยที่สุดเท่าที่ทำได้ ในขณะที่ยังทำได้ง่ายอยู่

บทความที่เกี่ยวข้อง