สคริปต์คือเพียงรายการคำสั่งที่เก็บในไฟล์ แทนที่จะรันลำดับคำสั่งโดยพิมพ์ทีละตัวบนเทอร์มินัลตลอดเวลา ผู้ใช้ระบบสามารถเก็บคำสั่งทั้งหมดไว้ในไฟล์ และเรียกไฟล์ซ้ำๆ เพื่อรันคำสั่งหลายครั้ง
ขณะเรียนรู้สคริปติ้งหรือในช่วงแรกของการเขียนสคริปต์ เรามักเริ่มด้วยการเขียนสคริปต์เล็กหรือสั้นที่มีคำสั่งไม่มาก และเรามักดีบักสคริปต์เหล่านั้นโดยไม่ทำอะไรมากกว่าการดูเอาต์พุทและให้แน่ใจว่าทำงานตามที่เราตั้งใจ
อย่างไรก็ตาม เมื่อเราเริ่มเขียนสคริปต์ที่ยาวและขั้นสูงมากขึ้น มีพันบรรทัดของคำสั่ง เช่น สคริปต์ที่ปรับตั้งค่าระบบ ทำแบ็คอัพสำคัญผ่านเครือข่าย และอีกมากมาย เราจะตระหนักว่าการดูแค่เอาต์พุทของสคริปต์ไม่เพียงพอที่จะหาบั๊กภายในสคริปต์
ดังนั้น ในซีรีส์การดีบักเชลล์สคริปต์ใน Linux นี้ เราจะเดินผ่านวิธีเปิดใช้งานการดีบักเชลล์สคริปต์ ไปต่อที่การอธิบายโหมดการดีบักเชลล์สคริปต์ต่างๆ และวิธีใช้พวกมันในซีรีส์ต่อไป
วิธีเริ่มต้นสคริปต์
สคริปต์แตกต่างจากไฟล์อื่นด้วยบรรทัดแรก ที่มี #! (She-bang – กำหนดประเภทไฟล์) และ path name (path ไปยัง interpreter) ซึ่งบอกระบบว่าไฟล์นี้เป็นชุดคำสั่งที่จะถูกแปลโดยโปรแกรมที่ระบุ (interpreter)
ด้านล่างเป็นตัวอย่าง "บรรทัดแรก" ในประเภทสคริปต์ต่างๆ:
#!/bin/sh [สำหรับ sh scripting] #!/bin/bash [สำหรับ bash scripting] #!/usr/bin/perl [สำหรับ perl programming] #!/bin/awk -f [สำหรับ awk scripting]
หมายเหตุ: บรรทัดแรกหรือ #! สามารถละเว้นได้ หากสคริปต์ประกอบด้วยชุดคำสั่งระบบมาตรฐานอย่างเดียว โดยไม่มีคำสั่งเชลล์ภายใน
วิธีรัน Shell Script ใน Linux
ไวยากรณ์แบบดั้งเดิมสำหรับเรียกเชลล์สคริปต์คือ:
$ script_name argument1 ... argumentN
รูปแบบอีกแบบหนึ่งคือระบุเชลล์ที่จะรันสคริปต์อย่างชัดเจน ดังนี้:
$ shell script_name argument1 ... argumentN
ตัวอย่าง:
$ /bin/bash script_name argument1 ... argumentN [สำหรับ bash scripting] $ /bin/ksh script_name argument1 ... argumentN [สำหรับ ksh scripting] $ /bin/sh script_name argument1 ... argumentN [สำหรับ sh scripting]
สำหรับสคริปต์ที่ไม่มี #! เป็นบรรทัดแรก และมีเฉพาะคำสั่งระบบพื้นฐาน เช่น ตัวอย่างด้านล่าง:
#script containing standard system commands cd /home/$USER mkdir tmp echo "tmp directory created under /home/$USER"
เพียงทำให้รันได้และรันดังนี้:
$ chmod +x script_name $ ./script_name
วิธีการเปิดใช้งาน Shell Script Debugging Mode
ด้านล่างคือตัวเลือกการดีบักเชลล์สคริปต์หลัก:
-v(ย่อมาจาก verbose) – สั่งให้เชลล์แสดงบรรทัดทั้งหมดในสคริปต์ขณะที่ถูกอ่าน เปิดใช้งาน verbose mode-n(ย่อมาจาก noexec หรือ no execution) – สั่งให้เชลล์อ่านคำสั่งทั้งหมด แต่ไม่ได้รันมัน ตัวเลือกนี้เปิดใช้งาน syntax checking mode-x(ย่อมาจาก xtrace หรือ execution trace) – สั่งให้เชลล์แสดงคำสั่งทั้งหมดและอาร์กิวเมนต์บนเทอร์มินัลขณะที่ถูกรัน ตัวเลือกนี้เปิดใช้งาน shell tracing mode
1. การแก้ไขบรรทัดแรกของ Shell Script
กลไกแรกคือการเปลี่ยนบรรทัดแรกของเชลล์สคริปต์ดังนี้ ซึ่งจะเปิดใช้งานการดีบักทั้งสคริปต์
#!/bin/sh option(s)
ในรูปแบบข้างต้น option สามารถเป็นตัวเลือกการดีบักอย่างใดอย่างหนึ่งหรือการรวมกัน
2. การเรียกเชลล์พร้อมตัวเลือกการดีบัก
กลไกที่สองคือการเรียกเชลล์พร้อมตัวเลือกการดีบักดังนี้ วิธีนี้ก็จะเปิดใช้งานการดีบักทั้งสคริปต์เช่นกัน
$ shell option(s) script_name argument1 ... argumentN
ตัวอย่าง:
$ /bin/bash option(s) script_name argument1 ... argumentN
3. การใช้คำสั่ง set Shell Built-in Command
กลไกที่สามคือการใช้คำสั่ง set built-in เพื่อดีบักส่วนที่กำหนดของเชลล์สคริปต์ เช่น ฟังก์ชัน กลไกนี้สำคัญ เพราะมันอนุญาตให้เราเปิดใช้งานการดีบักที่ส่วนใดส่วนหนึ่งของเชลล์สคริปต์
เราสามารถเปิดใช้งานโหมดการดีบักด้วยคำสั่ง set ในรูปแบบด้านล่าง โดย option เป็นตัวเลือกการดีบักใดๆ
$ set option
เพื่อเปิดใช้งานโหมดการดีบัก ใช้:
$ set -option
เพื่อปิดใช้งานโหมดการดีบัก ใช้:
$ set +option
นอกจากนี้ หากเราเปิดใช้งานโหมดการดีบักหลายโหมดในส่วนต่างๆ ของเชลล์สคริปต์ เราสามารถปิดทั้งหมดพร้อมกันได้ดังนี้:
$ set -
ขอจบเพียงเท่านี้สำหรับการเปิดใช้งานโหมดการดีบักเชลล์สคริปต์ ตามที่เห็น เราสามารถดีบักทั้งเชลล์สคริปต์หรือส่วนเฉพาะของสคริปต์ได้
ในสองตอนถัดไปของซีรีส์นี้ เราจะครอบคลุมวิธีใช้ตัวเลือกการดีบักเชลล์สคริปต์เพื่ออธิบาย verbose, syntax checking และ shell tracing debugging modes พร้อมตัวอย่าง
สำคัญ อย่าลืมถามคำถามเกี่ยวกับคู่มือนี้ หรือให้ข้อเสนอแนะผ่านส่วนความคิดเห็นด้านล่าง จนกว่าจะพบกันใหม่ ติดต่อกับ Tecmint