Tenho vários algoritmos diferentes, que preciso prototipar.
Então eu faço protótipos de programas e um script. o script chamado time.sh
se parece com isso
echo "Timing algorithm1:"
time algo1 >dev/null
echo "Timing algorithm2:"
time algo2 >dev/null
echo "Timing algorithm3:"
time algo3 >dev/null
...
Agora, para simplificar, substitua ls
por algo1
... (não quero postar código para cada algoritmo, forçar as pessoas a compilá-lo ...)
echo " Timing ls"
time ls 2>&1 > /dev/null
chame-otime_ls.sh
então eu faço
sh time_ls.sh > ls_sh.meas
Não importa o que eu faça, quaisquer que sejam os redirecionamentos que eu coloque no script ou na linha de comando, obtenho um dos dois resultados. Ou eu recebo a saída de eco, ou seja, "Timing ls" no terminal e os dados de tempo ls_sh.meas
ou o oposto.
É como se o stdout e o stderr não quisessem se juntar e criar um arquivo de dados do bebê.
Alguém pode explicar esse comportamento estranho e sugerir uma solução alternativa?
PS: Isso é feito no bash.
Em shells do tipo Korn,
time
é a palavra-chave que introduz:construir. O que
time
é uma linha de pipe, ou seja, comandos conectados com um pipe.São exemplos de pipelines cronometrados por
time
.As
time
estatísticas são relatadas no stderr do shell após o retorno dos processos no pipeline, mas em cada parte2> ...
do pipeline sendo cronometrado, eles não estão redirecionandotime
a saída de estatísticas do .Você precisa que stderr tenha sido redirecionado antes que a
time ...
construção seja avaliada. Por exemplo com:Para redirecionar apenas a
time
saída e não os erros dos comandos no<pipeline>
, você pode salvar o stderr anterior em um diferentefd
e restaurá-lo dentro do pipeline que está sendo cronometrado. Por exemplo:Para canalizar essa saída para outro comando:
Onde também precisamos restaurar o stdout depois de salvar no fd 4.
Para passar todos os stdout, stderr e as
time
estatísticas para um comando, basta fazer:Acho que você quer a saída
time
e a saída de cada protótipo incluída no mesmo arquivo de log:Em seguida, torne o arquivo executável e chame-o
Ou se você não quiser que o nome do arquivo de saída seja codificado no script, mas apenas ter a saída gravada em stdout :
E
Em ambos os scripts, você pode remover o
>/dev/null
de cadatime
linha se quiser que a saída dos algoritmos seja intercalada com os tempos.Defina um redirecionamento no início de um script: