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