ฉันมีสคริปต์ที่วัดระยะเวลาที่คำสั่งดำเนินการ
มันต้องการtime
คำสั่ง"ของจริง" ความหมายไบนารีเป็นตัวอย่างใน/usr/bin/time
(เนื่องจาก bash-built-in ไม่มี-f
แฟล็ก)
ด้านล่างสคริปต์แบบง่ายซึ่งสามารถดีบั๊กได้:
#!/bin/bash
TIMESEC=$(echo blah | ( /usr/bin/time -f %e grep blah >/dev/null ) 2>&1 | awk -F. '{print $1}')
echo ABC--$TIMESEC--DEF
if [ "$TIMESEC" -eq 0 ] ; then
echo "we are here!"
fi
บันทึกเป็น "test.sh" และดำเนินการ:
$ bash test.sh
ABC--0--DEF
we are here!
ดังนั้นมันจึงทำงานได้
ตอนนี้เรามาลองแก้ไขข้อบกพร่องโดยเพิ่ม "-x" ลงใน bash command line:
$ bash -x test.sh
++ echo blah
++ awk -F. '{print $1}'
+ TIMESEC='++ /usr/bin/time -f %e grep blah
0'
+ echo ABC--++ /usr/bin/time -f %e grep blah 0--DEF
ABC--++ /usr/bin/time -f %e grep blah 0--DEF
+ '[' '++ /usr/bin/time -f %e grep blah
0' -eq 0 ']'
test.sh: line 10: [: ++ /usr/bin/time -f %e grep blah
0: integer expression expected
ทำไมสคริปต์นี้แตกเมื่อเราใช้ "-x" และทำงานได้ดีหากไม่มีสคริปต์
BASH_XTRACEFD
ให้คุณเปลี่ยนเส้นทางของset -x
เอาต์พุตไปยังที่อื่นซึ่งเป็นปัญหาน้อยกว่า
-x
เปิดเมื่อการ$()
สร้างจะได้รับการ-x
ส่งออกรวมเป็นส่วนหนึ่งของค่าผลลัพธ์ ไม่ทราบว่าเป็นพฤติกรรม "คาดหวัง" หรือข้อผิดพลาด แต่ ... หรืออาจเป็น subshell()
ภายในที่ให้-x
ผลผลิตจริง