ฉันมีปัญหากับสคริปต์บางอย่างในทุบตีเกี่ยวกับข้อผิดพลาดและพฤติกรรมที่ไม่คาดคิด ฉันต้องการตรวจสอบสาเหตุของปัญหาเพื่อให้สามารถใช้การแก้ไขได้ มีวิธีที่ฉันสามารถเปิด "debug-mode" บางชนิดเพื่อทุบตีเพื่อรับข้อมูลเพิ่มเติมหรือไม่
ฉันมีปัญหากับสคริปต์บางอย่างในทุบตีเกี่ยวกับข้อผิดพลาดและพฤติกรรมที่ไม่คาดคิด ฉันต้องการตรวจสอบสาเหตุของปัญหาเพื่อให้สามารถใช้การแก้ไขได้ มีวิธีที่ฉันสามารถเปิด "debug-mode" บางชนิดเพื่อทุบตีเพื่อรับข้อมูลเพิ่มเติมหรือไม่
คำตอบ:
เริ่มสคริปต์ทุบตีของคุณด้วยbash -x ./script.sh
หรือเพิ่มในสคริปต์ของคุณset -x
เพื่อดูผลลัพธ์การแก้ปัญหา
เพิ่มเติมด้วยbash
4.1 หรือใหม่กว่า:
หากคุณต้องการเขียนผลลัพธ์การดีบักไปยังไฟล์แยกต่างหากให้เพิ่มสิ่งนี้ในสคริปต์ของคุณ:
exec 5> debug_output.txt
BASH_XTRACEFD="5"
ดู: https://stackoverflow.com/a/25593226/3776858
หากคุณต้องการดูหมายเลขบรรทัดให้เพิ่มสิ่งนี้:
PS4='$LINENO: '
logger
คำสั่งคุณสามารถใช้สิ่งนี้เพื่อเขียนเอาต์พุตดีบักผ่าน syslog ของคุณด้วยการประทับเวลาชื่อสคริปต์และหมายเลขบรรทัด:
#!/bin/bash
exec 5> >(logger -t $0)
BASH_XTRACEFD="5"
PS4='$LINENO: '
set -x
# Place your code here
คุณสามารถใช้ตัวเลือก-p
ของlogger
คำสั่งเพื่อตั้งค่าสิ่งอำนวยความสะดวกและระดับการเขียนเอาต์พุตผ่าน syslog โลคัลเป็นไฟล์บันทึกการทำงาน
BASH_XTRACEFD="5"
bash เขียนเอาต์พุตการติดตามที่สร้างขึ้นเมื่อset -x
เปิดใช้งานไฟล์ descriptor 5. exec 5> >(logger -t $0)
เปลี่ยนเส้นทางเอาต์พุตจากไฟล์ descriptor 5 ไปยังlogger
คำสั่ง
set -x
ฉันมักจะใช้และset -x
set +x
คุณสามารถล้อมพื้นที่ที่คุณต้องการดูสิ่งที่เกิดขึ้นกับพวกเขาเพื่อเปิดการฟุ่มเฟื่อยขึ้น / ลง
#!/bin/bash
set -x
..code to debug...
set +x
นอกจากนี้ถ้าคุณได้ทำงานการพัฒนาและมีความคุ้นเคยกับรูปแบบของการตัดไม้ที่ไปโดยชื่อ log4j, log4perl ฯลฯ แล้วคุณอาจต้องการที่จะทำให้การใช้งานของlog4bash
สิ่งที่สกัดมาปล่อยให้หน้ามัน - ก้องเก่าธรรมดาเพียงไม่ตัดมัน log4bash เป็นความพยายามที่จะมีการบันทึกที่ดีขึ้นสำหรับสคริปต์ Bash (เช่นทำการเข้าสู่ระบบใน Bash suck น้อยลง)
จากตรงนี้คุณสามารถทำสิ่งนี้ในสคริปต์ Bash ของคุณ:
#!/usr/bin/env bash
source log4bash.sh
log "This is regular log message... log and log_info do the same thing";
log_warning "Luke ... you turned off your targeting computer";
log_info "I have you now!";
log_success "You're all clear kid, now let's blow this thing and go home.";
log_error "One thing's for sure, we're all gonna be a lot thinner.";
# If you have figlet installed -- you'll see some big letters on the screen!
log_captains "What was in the captain's toilet?";
# If you have the "say" command (e.g. on a Mac)
log_speak "Resistance is futile";
ทำให้เกิดผลลัพธ์ประเภทนี้:
log4sh
หากคุณต้องการสิ่งที่พกพามากขึ้นนอกจากนี้ยังมีพี่ ทำงานคล้ายกับlog4bash
ที่นี่:
alias say="spd-say"
. bashrc ซึ่งเลียนแบบsay
คำสั่งจาก distros หรือ OS X อื่น ๆ
มี bash debugger, bashdbซึ่งเป็นแพ็คเกจที่สามารถติดตั้งได้ในหลาย ๆ distros มันใช้โหมดการดีบักเพิ่มเติมในตัวของ bash ( shopt -s extdebug
) ดูเหมือน gdb มาก; นี่คือเซสชั่นตัวอย่างเพื่อให้รสชาติ:
$ ls
1st.JPG 2ndJPG.JPG
$ cat ../foo.sh
for f in *.JPG
do
newf=${f/JPG/jpg}
mv $f $newf
done
$ bashdb ../foo.sh
(foo.sh:1):
1: for f in *.JPG
bashdb<0> next
(foo.sh:3):
3: newf=${f/JPG/jpg}
bashdb<1> next
(foo.sh:4):
4: mv $f $newf
เช่นเดียวกับใน gdb คำสั่งจะปรากฏขึ้นก่อนที่จะดำเนินการ ดังนั้นเราสามารถตรวจสอบตัวแปรเพื่อดูว่าคำสั่งจะทำอะไรก่อนที่จะทำ
bashdb<2> print $f $newf
1st.JPG 1st.jpg
bashdb<3> next
(foo.sh:1):
1: for f in *.JPG
bashdb<4> next
(foo.sh:3):
3: newf=${f/JPG/jpg}
bashdb<5> next
(foo.sh:4):
4: mv $f $newf
bashdb<6> print $f $newf
2ndJPG.JPG 2ndjpg.JPG
นั่นไม่ใช่สิ่งที่เราต้องการ! ลองดูการขยายพารามิเตอร์อีกครั้ง
bashdb<7> print $f ${f/JPG/jpg}
2ndJPG.JPG 2ndjpg.JPG
bashdb<8> print $f ${f/JPG$/jpg}
2ndJPG.JPG 2ndJPG.JPG
bashdb<9> print $f ${f/%JPG/jpg}
2ndJPG.JPG 2ndJPG.jpg
ตกลงนั่นใช้ได้ ลองตั้งค่าnewf
ที่ถูกต้อง
bashdb<10> eval newf=${f/%JPG/jpg}
$? is 0
bashdb<11> print $f $newf
2ndJPG.JPG 2ndJPG.jpg
ดูดี. ดำเนินการต่อสคริปต์
bashdb<12> next
Debugged program terminated normally. Use q to quit or R to restart.
$ ls
1st.jpg 2ndJPG.jpg
วิธีมาตรฐานในการดีบักสคริปต์ในเชลล์ที่ใช้บอร์นส่วนใหญ่เช่น bash คือการเขียนset -x
ที่ด้านบนสุดของสคริปต์ของคุณ สิ่งนี้จะทำให้ข้อมูลเพิ่มเติมเกี่ยวกับสิ่งที่กำลังทำ / ดำเนินการได้อย่างสมบูรณ์ยิ่งขึ้นและวิธีการประเมินข้อโต้แย้ง
-x Print commands and their arguments as they are executed.
สิ่งนี้มีประโยชน์สำหรับทั้งตัวแปลหรือสคริปต์ภายใน ตัวอย่างเช่น:
$ find "$fileloc" -type f -prune "$filename" -print
+ find /var/adm/logs/morelogs -type f -prune '-name *.user' -print
find: unknown predicate '-name *.user'
$ find "$fileloc" -type f -prune $filename -print
+ find /var/adm/logs/morelogs -type f -prune -name '*.user' -print
find: '/var/adm/logs/morelogs': No such file or directory
ในข้างต้นเราจะเห็นว่าเหตุใดการค้นหาจึงล้มเหลวเนื่องจากคำพูดบางคำ
set +x
ปิดใช้งานคุณลักษณะเพียงพิมพ์
คุณสามารถใช้สภาพแวดล้อมแบบรวมของ Eclipse และ Shelled ด้วยสคริปต์ "_DEBUG.sh" ที่ลิงก์ด้านล่าง
โดยค่าเริ่มต้นเครื่องมือการพัฒนาของ Shelled ใช้/bin/dash
เป็นล่าม ฉันเปลี่ยนสิ่งนี้เป็น/bin/bash
ความเข้ากันได้ดีขึ้นกับตัวอย่างเชลล์ส่วนใหญ่บนเว็บและสภาพแวดล้อมของฉัน
หมายเหตุ:คุณสามารถเปลี่ยนแปลงสิ่งนี้ได้โดยไปที่: Window -> Preference -> Shell Script -> Interpreters
แพ็คเกจดีบักเกอร์มีขั้นตอนในการใช้_DEBUG.sh
สคริปต์สำหรับการดีบักสคริปต์ของคุณซึ่งโดยทั่วไป (readme.txt):
- สร้างโครงการเชลล์สคริปต์: ไฟล์ -> New -> อื่น ๆ -> Shell Script -> Shell Script ตัวช่วยสร้างโครงการ
- สร้างแฟ้มสคริปต์ทุบตี: ไฟล์ -> New ->ไฟล์
script.sh
สำหรับตัวอย่างนี้ก็จะเป็น ส่วนขยายควรเป็น ".sh" และเป็นสิ่งที่ต้องทำ- คัดลอกไฟล์
_DEBUG.sh
ไปยังโฟลเดอร์โครงการแทรกข้อความต่อไปนี้ที่ด้านบนของไฟล์
script.sh
:. _DEBUG.sh
หากไฟล์ถูกสร้างขึ้นใน Microsoft Windows แล้วให้แน่ใจว่าจะรันไฟล์ -> แปลงสายคั่นต้องการ -> Unix
ตั้งค่าคอนฟิเกอเรชันการเปิดตัว debug: Run -> Debug Configuration -> Bash script ...มี 2 ฟิลด์ให้ตั้งค่าที่นี่:
a) "Bash script:" - พา ธ ในเวิร์กสเปซของ Eclipse ไปยังสคริปต์ Bash เพื่อทำการดีบัก
e) "พอร์ตดีบักเกอร์:" 33333สลับไปยังมุมมองการดีบัก เริ่มเซสชันการดีบัก เรียกใช้
script.sh
จาก bash shell
ดีบัก bash นี้มีคุณสมบัติครบถ้วนของ debuggers โปรแกรมมาตรฐานเช่น:
Shelled (Shell Script Editor) IDE (Integrated Development Environment) มีโบนัสเพิ่มเติมสำหรับการตรวจสอบบริบทการเน้นและเยื้องในขณะที่เขียนสคริปต์ของคุณ หากการเยื้องไม่ถูกต้องคุณอาจสามารถตั้งค่าสถานะ / ข้อผิดพลาดจำนวนมากได้ในทันที
แล้วยังมีประโยชน์อื่น ๆ ของ IDEเช่น:
ทรัพยากรที่ยอดเยี่ยมปรากฏในปีที่ผ่านมา: http://shellcheck.net
มันแสดงให้คุณเห็นมากกว่าการทุบตีทั่วไปทำให้คุณสามารถค้นหาคำพูดที่ไม่น่ารำคาญหรือวงเล็บปีกกาที่น่ารำคาญได้อย่างง่ายดาย
เพียงตรวจสอบให้แน่ใจว่าคุณไม่ได้วาง infos ที่ละเอียดอ่อน (ips รหัสผ่านและอื่น ๆ ) ผ่านเน็ต ... (โดยเฉพาะอย่างยิ่งเนื่องจากเป็น http, ไม่ได้เข้ารหัส) (ฉันเชื่อว่า shellcheck นั้นยังมีให้ดาวน์โหลด แต่ฉันไม่แน่ใจ)
ใช้เพียง:
#!/bin/bash -x
เหมือนกันสำหรับเชลล์:
#!/bin/sh -x
ทุกวันนี้มี VS Code Bash Debug
https://marketplace.visualstudio.com/items?itemName=rogalmic.bash-debug
มันมี 'Step in / out / over' และยังแสดงค่าของแต่ละตัวแปร