Saya memiliki skrip yang mengukur berapa lama beberapa perintah dijalankan.
Dibutuhkan perintah "real" time
, artinya, biner misalnya dalam /usr/bin/time
(karena bash-built-in tidak memiliki -f
flag).
Di bawah ini, skrip yang disederhanakan yang dapat di-debug:
#!/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
Simpan sebagai "test.sh" dan jalankan:
$ bash test.sh
ABC--0--DEF
we are here!
Jadi itu berhasil.
Sekarang, mari kita coba debug ini dengan menambahkan "-x" ke 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
Mengapa skrip ini rusak ketika kita menggunakan "-x", dan berfungsi dengan baik tanpa itu?
BASH_XTRACEFD
memungkinkan Anda mengarahkan set -x
output ke suatu tempat yang lebih mudah.
-x
pada, bahwa$()
konstruksinya mendapatkan-x
output termasuk sebagai bagian dari nilai yang dihasilkan. Tidak tahu apakah itu perilaku "yang diharapkan" atau bug ... Atau mungkin itu adalah subkulit()
di dalam yang sebenarnya memberikan-x
output.