Não é possível redirecionar stdout / stderr para o arquivo de log [duplicado]

2

Eu tenho um script tmp.sh

#!/bin/bash

echo hello
sleep 3
echo 3

Eu quero registrar o tempo de execução do script (assim como o stdout do script) em um arquivo de log.

user$ time ./tmp.sh >& log.tmp

real    0m3.003s
user    0m0.000s
sys     0m0.003s

não funciona.

user$ time ./tmp.sh 2>&1 log.tmp
hello
3

real    0m3.003s
user    0m0.002s
sys     0m0.001s

isso também não funciona.

Qual é a maneira correta de registrar a saída do comando time no arquivo de log?

    
por linux testers 27.04.2016 / 03:57

1 resposta

2

O time incorporado em bash mostra informações de tempo em STDERR após o comando após ele (o atual) retornar. Portanto, a menos que você os agrupe e passe o STDERR do grupo para um arquivo, somente o STDERR do comando real será redirecionado para o arquivo e o arquivo será fechado quando o comando retornar (antes de time mostrar suas informações).

Você pode usar o agrupamento de comandos, redirecionando STDOUT e STDERR:

{ time ./tmp.sh ;} &>log.tmp  

Ou execute em um subshell:

( time ./tmp.sh ) &>log.tmp

Exemplo:

$ { time sleep 1 ;} 2>time.log
$ cat time.log 

real    0m1.001s
user    0m0.000s
sys     0m0.000s


$ ( time sleep 1 ) 2>time.log
$ cat time.log 

real    0m1.001s
user    0m0.000s
sys     0m0.000s
    
por 27.04.2016 / 04:10