Tôi có một kịch bản đo thời gian một số lệnh thực thi.
Nó cần lệnh "thực" time
, nghĩa là một nhị phân chẳng hạn trong /usr/bin/time
(vì bash-in-in không có -f
cờ).
Dưới đây, một tập lệnh đơn giản hóa có thể được gỡ lỗi:
#!/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
Lưu dưới dạng "test.sh" và thực thi:
$ bash test.sh
ABC--0--DEF
we are here!
Vì vậy, nó đã làm việc.
Bây giờ, hãy thử gỡ lỗi này bằng cách thêm "-x" vào dòng lệnh bash:
$ 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
Tại sao tập lệnh này bị hỏng khi chúng tôi sử dụng "-x" và hoạt động tốt mà không có nó?
BASH_XTRACEFD
cho phép bạn chuyển hướng set -x
đầu ra đến một nơi nào đó ít rắc rối hơn.
-x
, rằng$()
cấu trúc đang nhận-x
đầu ra được bao gồm như là một phần của giá trị kết quả của nó. Không biết đó là hành vi "mong đợi" hay lỗi ... Hoặc có thể đó là phần con()
bên trong thực sự mang lại-x
đầu ra.