มีวิธีการแก้จุดบกพร่องสคริปต์ทุบตีโดยไม่ต้องใช้ echo และเข้าสู่ระบบ?
ฉันกำลังพูดถึงการใช้เบรกพอยต์และสิ่งต่างๆเช่นนั้น
มีวิธีการแก้จุดบกพร่องสคริปต์ทุบตีโดยไม่ต้องใช้ echo และเข้าสู่ระบบ?
ฉันกำลังพูดถึงการใช้เบรกพอยต์และสิ่งต่างๆเช่นนั้น
คำตอบ:
นอกจากนี้คุณยังสามารถใช้set -x
และset -v
เมื่อดำเนินการ ข้อมูลเพิ่มเติม:
http://www.linuxtopia.org/online_books/advanced_bash_scripting_guide/debugging.html http://www.cyberciti.biz/tips/debug-shell-script.html
โชคดี!
มีหลายวิธีเช่น:
รันสคริปต์ของคุณด้วยตัวเลือก -x
bash -x yourscript.sh
เพิ่มset -x
ในบรรทัดใหม่ที่จุดเริ่มต้นของ scriptfile หลังจาก Shebang #!/bin/bash
และก่อนที่จะเริ่มสคริปต์ของคุณset -v
จะแสดงบรรทัดอินพุตเชลล์set -x
แสดงคำสั่งและอาร์กิวเมนต์ที่ดำเนินการ
แทนที่ shebang ของไฟล์สคริปต์ของคุณด้วย #!/bin/bash -xv
ปัจจุบันมีเป็นของ Visual Studio นามสกุลรหัสทุบตีตรวจแก้จุดบกพร่อง มันมี 'ขั้นตอนใน / ออก / มากกว่า' และสามารถแสดงค่าของแต่ละตัวแปร
shellcheck ดีที่สุดในเมือง -
คุณสามารถรวมเข้ากับเสียงเรียกเข้าได้ด้วยนี่คือ repo คอมไพล์ -
คุณสามารถใช้ฟังก์ชั่นขนาดเล็กนี้เพื่อวางลงใน "คอนโซล":
function debug
{
echo "#############| Entering DEBUG mode |####################";
cmd=""
while [[ $cmd != "exit" ]]; do
read -p "> " cmd
case "$cmd" in
vars ) ( set -o posix ; set );;
exit ) ;;
* ) eval "$cmd";;
esac
done
echo "#############| End of DEBUG mode |####################";
}
จากนั้นภายในสคริปต์ของคุณ (ตัวอย่าง):
for file in *; do
...
if [[ $file == "strange_case.txt" ]]; then
# break the code here to analyze:
debug
fi
...
done
มันจะยอมรับคำสั่งใด ๆ ทำให้ตัวแปรท้องถิ่นยังคงอยู่ หากต้องการออกจากโหมด "debug" ให้พิมพ์ "exit" (จะไม่ออกจากสคริปต์) และจะดำเนินการต่อด้วยรหัส หากคุณใช้ "debug" ภายในลูปมันจะหยุดทุกครั้ง คุณสามารถห่อไว้ใน "if" (ดังในตัวอย่างด้านบน) หรือสร้างฟังก์ชัน "watch":
function debug_watch
{
if [[ $1 == $2 ]]; then
debug
fi
}
# And Use it:
debug_watch "$file" "strange_case.txt"
ฉันยังเพิ่มคำสั่ง "vars" ซึ่งจะถ่ายโอนตัวแปรและค่าที่มีอยู่ทั้งหมด คุณสามารถเพิ่มคำสั่งที่คุณกำหนดเองได้เช่นกัน
ฉันใช้รหัสในเวลาไม่กี่นาทีเพื่อใช้งานภายใต้ความเสี่ยงของคุณเอง โปรดระวังว่าในโหมดดีบักคำสั่งใด ๆ สามารถถูกเรียกใช้งานได้ดังนั้นจึงมีความเสี่ยงด้านความปลอดภัยหากคุณทิ้งไว้ในสคริปต์ที่ใช้งานจริง
เมื่อต้องการปรับแต่งสิ่งที่ NES กำลังพูดถึงมีการตั้งค่าสถานะเป็น bash เพื่ออนุญาตให้ทำการดีบัก
การset -x
ตั้งค่าสถานะอาจถูกตั้งค่าและยกเลิกการตั้งค่าจากเทอร์มินัลหรือจากภายในสคริปต์ของคุณ ใช้+
หรือ-
:
#!/bin/bash
#fileinfo
ls -l $1
set -x # start debugging here
wc -l $1
set +x # stop debugging here
file $1
set -v # start verbose output
w | more
echo ""
echo -n "Number of users: "
set +v # end verbose output
who | wc -l
นี่คือสิ่งที่set
คำสั่งทำ:
set -f
ปิดใช้งานการสร้างชื่อไฟล์โดยใช้ตัวอักษรset -v
พิมพ์บรรทัดอินพุตเชลล์ (verbose) ขณะที่ถูกอ่านset -x
พิมพ์ร่องรอยคำสั่งก่อนที่จะดำเนินการคำสั่งset
จริงๆแล้วมีคุณสมบัติมากมาย แต่ไม่มีหน้าคนที่น่าเวทนาเพราะมันเป็นเครื่องมือสร้างเชลล์ คู่มือสำหรับการตั้งค่าที่อยู่ในเอกสาร GNU ทุบตี
มีเครื่องมือบรรทัดคำสั่งมากมายที่สามารถช่วยให้คุณรับรายละเอียดเกี่ยวกับโปรแกรมของคุณเช่น:
stat
แสดงไฟล์หรือสถานะระบบไฟล์ file
กำหนดประเภทไฟล์hexdump
ตัวกรองที่แสดงไฟล์ที่ระบุในหลากหลายรูปแบบnohup
เรียกใช้สคริปต์ที่จะไม่หยุด
และอื่น ๆ มากมาย ฉันพยายามนึกถึงคำสั่งที่แสดงตัวละครที่ซ่อนอยู่ แต่ฉันไม่สามารถทำได้ตอนนี้ Hexdump จะทำ แต่มีดีกว่า
คำสั่งที่สำคัญctrl\จะทำให้โปรแกรมหรือสคริปต์ทำงานเพื่อถ่ายโอนข้อมูลหลัก จากนั้นคุณสามารถวิเคราะห์ coredump ฉันอาจจะใช้ gdb เพื่อวิเคราะห์ coredump แต่มีหลายโปรแกรมสำหรับสิ่งนั้น
เปลือก bash มีตัวเลือกที่ดีสำหรับการดีบักเช่นกัน ตัวเลือก--debugger
, -v
ละเอียด, --dump-strings
และตัวเลือกที่ดีอื่น ๆ ที่จะช่วยให้คุณ ลองใช้man bash
ดู
trap
คำสั่ง (เปลือกที่สร้างขึ้นใน) อาจจะเป็นประโยชน์มากสำหรับคุณ trap บอกว่าถ้าโปรแกรมของคุณออกโดยไม่คาดคิดให้รันบางสิ่ง คุณอ่านเกี่ยวกับดักและอื่น ๆ ที่มีประโยชน์ทุบตีเชลล์ builtins ที่นี่
โดยทั่วไปแล้วการดีบักเป็นหัวข้อใหญ่ในทุกภาษา หัวข้ออื่น ๆ ที่มีประโยชน์สำหรับการดีบักในภาษาการเขียนโปรแกรมใด ๆ ได้แก่ การเปลี่ยนเส้นทางเชลล์และการประมวลผลสัญญาณ
ในที่สุดฉันก็รู้ว่าฉันใช้ตัวอย่างเล็กน้อย แต่เชลล์สคริปต์บางตัวอาจเป็นหลายร้อยบรรทัด ในสถานการณ์เหล่านั้นฉันต้องการแทรกแท็กความคิดเห็นและปิดกั้นรหัสที่ฉันสงสัยว่ามีข้อบกพร่องหรืออีกทางหนึ่งคือแทรกคำสั่ง exit และพยายามแยกรหัสการทำงานออกจากรหัสที่ใช้งานไม่ได้โดยใช้เทคนิคการแบ่งและพิชิต
ตัวเลือก GUI สำหรับการดีบักสคริปต์ทุบตีคือ Eclipse IDE พร้อมกับ pluggins BashEclipse / Shelled
สิ่งนี้จะให้คุณสมบัติของคำถามของคุณ ( breakpoints and stuff
) พร้อมกับโฮสต์ของคุณสมบัติอื่น ๆ สำหรับการดีบักสคริปต์ทุบตีที่ซับซ้อน
คุณลักษณะบางอย่างรวมถึง:
( https://unix.stackexchange.com/questions/155551/how-to-debug-a-bash-script )
ขั้นตอนสำหรับการใช้คือการเพิ่มShelled
และBashEclipse
pluggins เพื่อ eclipse จากนั้นรันโพรซีเดอร์ที่ระบุใน BashEclipse read me text file เพื่อเริ่มดีบักเกอร์
* ) eval "$cmd" ;;
debug_watch "$file" strange_case.txt