Tengo un script que mide cuánto tiempo se ejecuta un comando.
Necesita el time
comando "real" , es decir, un binario, por ejemplo, en /usr/bin/time
(ya que bash-built-in no tiene la -f
bandera).
A continuación, un script simplificado que se puede depurar:
#!/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
Guardar como "test.sh" y ejecutar:
$ bash test.sh
ABC--0--DEF
we are here!
Entonces funcionó.
Ahora, intentemos depurar esto agregando "-x" a la línea de comando 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
¿Por qué este script se rompe cuando usamos "-x" y funciona bien sin él?
BASH_XTRACEFD
permite redirigir la set -x
salida a un lugar donde sea menos problemático.
-x
on, la$()
construcción está obteniendo la-x
salida incluida como parte de su valor resultante. Sin embargo, no sé si ese es el comportamiento "esperado" o un error ... O tal vez es la subshell()
que realmente está dando la-x
salida.