Não há diferença entre a primeira e a segunda atribuição, ou com var=$(echo foo)
no que se refere à saída padrão.
Em sua segunda instrução:
ElapsedTime=$(echo "$time" | tail -c 23)
A saída padrão do comando, que é a saída padrão do pipeline, neste caso tail
stdout, é atribuída ao conteúdo da variável e não exibida na tela.
Por outro lado, se um dos comandos internos exibir algo em seu fluxo de erro padrão, ele será exibido na tela, já que você não redireciona o stderr.
Observe que echo "$time"
não é confiável. Eu recomendaria printf "%s\n" "$time"
para evitar efeitos colaterais inesperados do valor time
.
tail -c -number
é POSIX, portanto, não esperaria que esse comando falhasse.