<ก่อนหน้านี้ | Contents | ถัดไป>
การติดตาม
บั๊กมักเป็นกรณีของโฟลว์ตรรกะที่ไม่คาดคิดภายในสคริปต์ กล่าวคือ บางส่วนของสคริปต์ไม่เคยถูกดำเนินการ หรือถูกดำเนินการในลำดับที่ผิดหรือในเวลาที่ไม่ถูกต้อง ในการดูโฟลว์จริงของโปรแกรม เราใช้เทคนิคที่เรียกว่า การติดตาม.
วิธีการติดตามวิธีหนึ่งเกี่ยวข้องกับการวางข้อความข้อมูลในสคริปต์ที่แสดงตำแหน่งของการดำเนินการ เราสามารถเพิ่มข้อความในส่วนโค้ดของเราได้:
echo "กำลังเตรียมลบไฟล์" >&2
ถ้า [[ -d $dir_name ]]; แล้วถ้า cd $dir_name; แล้ว
echo "กำลังลบไฟล์" >&2
rm *
อื่น
echo "ไม่สามารถ cd เป็น '$dir_name'" >&2 ออก 1
fi อื่น
echo "ไม่มีไดเรกทอรีดังกล่าว: '$dir_name'" >&2 ออก 1
fi
echo "การลบไฟล์เสร็จสิ้น" >&2
echo "กำลังเตรียมลบไฟล์" >&2
ถ้า [[ -d $dir_name ]]; แล้วถ้า cd $dir_name; แล้ว
echo "กำลังลบไฟล์" >&2
rm *
อื่น
echo "ไม่สามารถ cd เป็น '$dir_name'" >&2 ออก 1
fi อื่น
echo "ไม่มีไดเรกทอรีดังกล่าว: '$dir_name'" >&2 ออก 1
fi
echo "การลบไฟล์เสร็จสิ้น" >&2
เราส่งข้อความไปยังข้อผิดพลาดมาตรฐานเพื่อแยกข้อความออกจากเอาต์พุตปกติ นอกจากนี้เรายังไม่เยื้องบรรทัดที่มีข้อความ ดังนั้นจึงง่ายต่อการค้นหาเมื่อถึงเวลาต้องย้ายใหม่
เมื่อเรียกใช้สคริปต์แล้ว จะเห็นว่าการลบไฟล์ได้ดำเนินการเสร็จสิ้นแล้ว:
[me@linuxbox ~]$ deletion-script กำลังเตรียมที่จะลบไฟล์ที่กำลังลบไฟล์
การลบไฟล์เสร็จสมบูรณ์ [me@linuxbox ~]$
[me@linuxbox ~]$ deletion-script กำลังเตรียมที่จะลบไฟล์ที่กำลังลบไฟล์
การลบไฟล์เสร็จสมบูรณ์ [me@linuxbox ~]$
bash ยังจัดเตรียมวิธีการติดตาม ใช้งานโดยตัวเลือก -x และคำสั่ง set พร้อมตัวเลือก -x เมื่อใช้สคริปต์ปัญหาก่อนหน้า เราสามารถเปิดใช้งานการติดตามสำหรับสคริปต์ทั้งหมดโดยเพิ่มตัวเลือก -x ลงในบรรทัดแรก:
#!/bin/bash -x
#!/bin/bash -x
การแก้จุดบกพร่อง
# ปัญหา: สคริปต์เพื่อแสดงข้อผิดพลาดทั่วไป number=1
ถ้า [ $number = 1 ]; แล้ว
echo "จำนวนเท่ากับ 1" อื่น
echo "จำนวนไม่เท่ากับ 1"
fi
# ปัญหา: สคริปต์เพื่อแสดงข้อผิดพลาดทั่วไป number=1
ถ้า [ $number = 1 ]; แล้ว
echo "จำนวนเท่ากับ 1" อื่น
echo "จำนวนไม่เท่ากับ 1"
fi
เมื่อดำเนินการแล้ว ผลลัพธ์จะมีลักษณะดังนี้:
[me@linuxbox ~]$ ปัญหา
+ จำนวน=1
+ '[' 1 = 1 ']'
+ echo 'จำนวนเท่ากับ 1' จำนวนเท่ากับ 1
[me@linuxbox ~]$ ปัญหา
+ จำนวน=1
+ '[' 1 = 1 ']'
+ echo 'จำนวนเท่ากับ 1' จำนวนเท่ากับ 1
เมื่อเปิดใช้งานการติดตาม เราจะเห็นคำสั่งที่ดำเนินการกับส่วนขยายที่ใช้ เครื่องหมายบวกชั้นนำแสดงถึงการแสดงร่องรอยเพื่อแยกความแตกต่างจากเส้นของเอาต์พุตปกติ เครื่องหมายบวกเป็นอักขระเริ่มต้นสำหรับเอาต์พุตการติดตาม มันมีอยู่ใน PS4 (พร้อมท์สตริง 4) ตัวแปรเชลล์ เนื้อหาของตัวแปรนี้สามารถปรับเปลี่ยนเพื่อให้พรอมต์มีประโยชน์มากขึ้น ที่นี่ เราแก้ไขเนื้อหาของตัวแปรเพื่อรวมหมายเลขบรรทัดปัจจุบันในสคริปต์ที่ดำเนินการติดตาม โปรดทราบว่าต้องใช้เครื่องหมายคำพูดเดี่ยวเพื่อป้องกันการขยายจนกว่าจะใช้พรอมต์จริง:
[me@linuxbox ~]$ ส่งออก PS4='$LINENO + '
[me@linuxbox ~]$ ปัญหา
5 + ตัวเลข=1
7 + '[' 1 = 1 ']'
8 + echo 'จำนวนเท่ากับ 1' จำนวนเท่ากับ 1
[me@linuxbox ~]$ ส่งออก PS4='$LINENO + '
[me@linuxbox ~]$ ปัญหา
5 + ตัวเลข=1
7 + '[' 1 = 1 ']'
8 + echo 'จำนวนเท่ากับ 1' จำนวนเท่ากับ 1
ในการดำเนินการติดตามในส่วนที่เลือกของสคริปต์ แทนที่จะใช้สคริปต์ทั้งหมด เราสามารถใช้ เซ็ต สั่งกับ -x ตัวเลือก:
#! / bin / ทุบตี
# ปัญหา: สคริปต์เพื่อแสดงข้อผิดพลาดทั่วไป number=1
#! / bin / ทุบตี
# ปัญหา: สคริปต์เพื่อแสดงข้อผิดพลาดทั่วไป number=1
set -x # เปิดการติดตาม
ถ้า [ $number = 1 ]; แล้ว
echo "จำนวนเท่ากับ 1" อื่น
echo "จำนวนไม่เท่ากับ 1"
fi
set +x # ปิดการติดตาม
set -x # เปิดการติดตาม
ถ้า [ $number = 1 ]; แล้ว
echo "จำนวนเท่ากับ 1" อื่น
echo "จำนวนไม่เท่ากับ 1"
fi
set +x # ปิดการติดตาม
เราใช้ เซ็ต สั่งกับ -x ตัวเลือกเพื่อเปิดใช้งานการติดตามและ +x ตัวเลือกในการปิดใช้งานการติดตาม เทคนิคนี้สามารถใช้เพื่อตรวจสอบปัญหาได้หลายส่วน - บางสคริปต์