A principal diferença entre abrir o arquivo antes do loop com exec
e colocar o redirecionamento no comando no loop é que o primeiro requer a configuração do descritor de arquivo apenas uma vez, enquanto o segundo abre e fecha o arquivo para cada iteração do loop.
Fazê-lo uma vez provavelmente será mais eficiente, mas se você executar um comando externo dentro do loop, a diferença provavelmente desaparecerá no custo de iniciar o comando. ( echo
aqui provavelmente está embutido, então isso não se aplica)
Se a saída for enviada para algo diferente de um arquivo normal (por exemplo, se x
for um pipe nomeado), o ato de abrir e fechar o arquivo pode ficar visível para outros processos, portanto, pode haver diferenças no comportamento também.
Note que não há realmente nenhuma diferença entre um redirecionamento através de exec
e um redirecionamento no comando, ambos abrem o arquivo e fazem juggle nos números do descritor de arquivo.
Esses dois devem ser praticamente equivalentes, pois ambos open()
o arquivo e write()
. (Existem diferenças em como o fd 1 é armazenado durante o comando.):
for i in {1..1000}; do
>>x echo "$i"
done
for i in {1..1000}; do
exec 3>&1 1>>x # assuming fd 3 is available
echo "$i" # here, fd 3 is visible to the command
exec 1>&3 3>&-
done