Use o tempo integrado ao shell ao verificar o status de saída de uma função e suprimir a saída

3

Eu estou tentando fazer o seguinte em um script bash e estou querendo saber se é possível:

  • Tempo da saída de um comando (neste caso, mysql) usando time
  • Suprime a saída stdout do comando
  • Capture a saída stderr do comando em caso de erro
  • Verifique o código de status de saída do comando depois de executá-lo

Esta é uma cadeia complexa e não tive muita sorte em fazer tudo funcionar em conjunto. Eu posso fazer com que o código de status funcione se eu parar de usar o tempo.

Isso é o que eu tive até agora:

# the setup
TIMEFORMAT=%R
MYSQL=mysql <options>

# execute and time a query (does more than is listed here)
function executeQuery {

  TIME=$( time ( $MYSQL "$1" 2>&1 | tee /tmp/somefile.txt > /dev/null ) 2>&1 )

  # do something with $?

}

Estou redirecionando qualquer resposta de erro do comando para um arquivo usando tee e, em seguida, enviando o stdout resultante para / dev / null. Eu estou redirecionando o stderr do comando time para stdout, que deve acabar em $ TIME.

Agora, se eu alterar essa linha para algo como:

  TIME=$( time ( $MYSQL "$1" 2>&1 | tee /tmp/somefile.txt > /dev/null; exit ${PIPESTATUS[0]} ) 2>&1 )

Ele devolve corretamente o código de saída do mysql, mas quebra o comando time.

Isso é possível? Eu perdi alguma coisa? Espero que o objetivo seja claro.

Obrigado!

    
por futureal 04.12.2012 / 21:43

1 resposta

4

bash time é uma importante PITA. Sua saída não é redirecionável sem hacks desagradáveis como seus múltiplos níveis de subshells. O link sugere que a resposta correta é:

TIME = $( ( time $MYSQL "$1" 2>&1 | tee /tmp/somefile.txt > /dev/null; exit ${PIPESTATUS[0]} ) 2>&1 )

Observe que o bash time usa um pipeline inteiro como argumento, portanto, a colocação da subshell após a invocação do horário está incorreta.

Isso foi testado com

TIME = $( ( time ls /asdfasfdsfs 2>&1 | tee asdf 2>&1 >/dev/null ; exit ${PIPESTATUS[0]} ) 2>&1 );
echo $?;
echo $TIME

Que me deu

2
real 0m0.003s user 0m0.004s sys 0m0.004s
    
por 05.12.2012 / 00:10

Tags