Bash time keyword result somente com o segundo comando canalizado, explique porque

3

Eu tenho um comando de palavra-chave bash time que não consigo explicar completamente, mas funciona para mim.

Meu objetivo:

  1. para encontrar o tempo de execução de algum script python, que recebe uma variável btw, de dentro de um script bash, e captura esse valor.

  2. também para capturar a saída do script python na mesma variável, para análise de sucesso ou falha.

Depois de ler, acabei com este comando, mas não sou capaz de explicá-lo.

ttime=$( (TIMEFORMAT="%U^"; time  /../myscript.py ${__myvar} 2>&1 )|& tr -d f)

Você pode explicar por que eu preciso do segundo comando tr -d f no pipe, para o valor de tempo a ser anexado à saída do comando,

A escolha de 'tr -df' foi inteiramente arbitrária, e não afetará a saída do meu script, std ou err, mas sem ele, ou outro comando que atue na saída de texto dos scripts de alguma maneira, vejo o retorno do python sem o tempo anexado, por quê?

Editar:

A questão real deveria ter sido por que é o |& tr -d f . necessário, e como Stephanie diz que é o | & que está permitindo que os tempos encontrados no sterr da palavra-chave time sejam passados para a saída do pipeline

A solução agora parece:

ttime=$(TIMEFORMAT="%U^"; { time /../myscript.py ${__myvar} ; } 2>&1 )

Tutorial do descritor de campo:

link

    
por PuzzleTime 02.11.2017 / 13:07

1 resposta

4

Em bash , como em ksh , time é uma palavra-chave (não incorporada) usada para cronometrar um pipeline (não apenas um comando simples , também pode tempo comandos compostos).

Em time cmd 2> something , estamos sincronizando cmd 2> something e imprimindo a saída para stderr, mas para o stderr original.

Você precisa de stderr redirecionado antes que a time construct seja invocada. O que você faz com seu |& que redireciona o stdout e o stderr do subshell time é executado, mas uma maneira muito mais simples de fazê-lo seria:

time=$(TIMEFORMAT="%U^"; { time cmd; } 2>&1)

Isso não envolve um subshell (aqui usamos um grupo de comando ) nem um comando extra.

Observe que com bash :

time=$(time (cmd) 2>&1)

acontece de funcionar por acidente. Eu não confiaria nisso, pois isso pode mudar em versões futuras e não funciona em outros shells que têm uma palavra-chave time .

Se você quisesse apenas a saída de tempo em $time (e não a stdout ou stderr do comando), você faria:

{ time=$(TIMEFORMAT="%U^"; { time cmd 2>&3 3>&-; } 2>&1); } 3>&1
    
por 02.11.2017 / 14:19

Tags