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