Ich habe ein Skript, das misst, wie lange ein Befehl ausgeführt wird.
Es benötigt den time
Befehl "real" , was bedeutet, dass beispielsweise eine Binärdatei enthalten ist /usr/bin/time
(da die eingebaute Bash nicht über das -f
Flag verfügt).
Unten ein vereinfachtes Skript, das debuggt werden kann:
#!/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
Speichern Sie als "test.sh" und führen Sie Folgendes aus:
$ bash test.sh
ABC--0--DEF
we are here!
Also hat es geklappt.
Versuchen wir nun, dies zu debuggen, indem wir "-x" in die Bash-Befehlszeile einfügen:
$ 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
Warum bricht dieses Skript ab, wenn wir "-x" verwenden und es ohne funktioniert?
BASH_XTRACEFD
können Sie die set -x
Ausgabe an einen Ort umleiten, an dem es weniger Probleme gibt.
-x
on das$()
Konstrukt die-x
Ausgabe als Teil seines resultierenden Wertes erhalten. Ich weiß nicht, ob das ein "erwartetes" Verhalten oder ein Fehler ist ... Oder vielleicht ist es die Subshell()
, die tatsächlich die-x
Ausgabe liefert .