J'ai un script qui mesure la durée d'exécution d'une commande.
Il a besoin de la "vraie" time
commande, ce qui signifie, un binaire par exemple dans /usr/bin/time
(car le bash-built-in n'a pas le -f
drapeau).
Ci-dessous, un script simplifié qui peut être débogué:
#!/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
Enregistrez sous "test.sh" et exécutez:
$ bash test.sh
ABC--0--DEF
we are here!
Donc ça a marché.
Maintenant, essayons de déboguer ceci en ajoutant "-x" à la ligne de commande 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
Pourquoi ce script se casse-t-il lorsque nous utilisons "-x" et fonctionne correctement sans lui?
BASH_XTRACEFD
vous permet de rediriger la set -x
sortie vers un endroit où cela pose moins de problèmes.
-x
on, la$()
construction obtient la-x
sortie incluse dans le cadre de sa valeur résultante. Je ne sais pas si c'est un comportement "attendu" ou un bogue ... Ou peut-être que c'est le sous-shell à l'()
intérieur qui donne la-x
sortie.