Eu tenho um script que mede quanto tempo algum comando é executado.
Ele precisa do time
comando "real" , ou seja, um binário, por exemplo, em /usr/bin/time
(como o bash-built-in não possui o -f
sinalizador).
Abaixo, um script simplificado que pode ser depurado:
#!/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
Salve como "test.sh" e execute:
$ bash test.sh
ABC--0--DEF
we are here!
Então funcionou.
Agora, vamos tentar depurar isso adicionando "-x" à linha de comando do 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 que esse script é interrompido quando estamos usando "-x" e funciona bem sem ele?
BASH_XTRACEFD
permite redirecionar a set -x
saída para um local com menos problemas.
-x
on, a$()
construção está-x
incluindo a saída como parte do valor resultante. Não sei se esse é o comportamento "esperado" ou um bug ... Ou talvez seja o subshell()
dentro que está realmente fornecendo a-x
saída.