Mam skrypt mierzący czas wykonywania niektórych poleceń.
Potrzebuje polecenia „rzeczywistego” time
, czyli binarnego na przykład w /usr/bin/time
(ponieważ wbudowany bash nie ma -f
flagi).
Poniżej uproszczony skrypt, który można debugować:
#!/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
Zapisz jako „test.sh” i wykonaj:
$ bash test.sh
ABC--0--DEF
we are here!
Więc zadziałało.
Teraz spróbujmy to debugować, dodając „-x” do wiersza poleceń 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
Dlaczego ten skrypt się psuje, gdy używamy „-x” i działa bez niego dobrze?
BASH_XTRACEFD
pozwala przekierować set -x
wyjście do miejsca, w którym jest mniej problemów.
-x
na to, że z$()
konstrukcją-x
włącza się wynik jako część jego wynikowej wartości. Nie wiem jednak, czy jest to „oczekiwane” zachowanie, czy błąd… A może to właśnie()
wewnętrzna powłoka daje-x
wynik.