Se você redirecionar o stdout para o resto do script, então isso incluiria o comando "cat", para que você não visse sua saída, $file
poderia preencher indefinidamente com cópias recursivas de si mesmo (e se não seria tão pequeno a ponto de deixar cat
ver o final antes de começar a escrever para ele).
Para redirecionar a stdout de agora em diante, você simplesmente faz:
exec > "$file"
Mas aqui talvez você queira:
#! /bin/bash -
{
echo spo
echo car
} > "$file"
cat < "$file"
Você também pode fazer coisas como:
exec 3>&1 # save stdout as fd 3
exec > "$file"
echo spo
echo car
exec >&3 3>&- # restore stdout and close fd 3
cat < "$file"
(e, a propósito, o acima é o que os shells modernos fazem internamente quando você redireciona um comando composto como { some; code; } > ...
(embora eles usem um fd acima de 10 e configurem o flag O_CLOEXEC nele para que os comandos executados não vejam ele), enquanto o shell Bourne iria bifurcar um subshell nesse caso)
Observe também que, no código acima, você não tem para restaurar o stdout para o restante do script. Você pode fazer isso apenas para o comando cat
:
cat < "$file" >&3 3>&-
(o 3>&-
(fechando o fd 3) não é necessário, pois cat
não usa seu fd 3, mas é uma boa prática no caso geral, e estritamente falando, nós teríamos que adicioná-lo a cada comando para emular o comportamento O_CLOEXEC do shell).