dado este trecho:
exec 3>f
echo foo >&3
echo bar >&3
cat f # returns foo bar
Por que o bash é anexado a f? Estou esquecendo de algo?
dado este trecho:
exec 3>f
echo foo >&3
echo bar >&3
cat f # returns foo bar
Por que o bash é anexado a f? Estou esquecendo de algo?
Respostas:
O que está faltando é que você está abrindo (e truncando) o arquivo apenas f
uma vez, na exec
chamada. Os dois echo
comandos estão apenas gravando em um descritor de arquivo já aberto. O arquivo f
, portanto, não será truncado por nenhuma das echo
chamadas.
Para redirecionar a saída padrão para um descritor de arquivo, a sintaxe é >&n
onde n
está um pequeno número inteiro positivo que indica o descritor de arquivo (não há >>&n
redirecionamento). O descritor de arquivo já deve estar associado a um arquivo aberto para que isso funcione. É o ato de abrir o arquivo e associá-lo a um descritor exec 3>f
que trunca o arquivo ( exec 3>>f
não teria truncado o arquivo e o teria aberto no modo de acréscimo). Apenas escrever com >&3
não abre o arquivo nem o trunca.
Teria sido diferente se você tivesse feito
echo foo >f
echo bar >f
cat f
(cada um echo
é aberto e truncado f
) ou, mais complicado,
exec 3>f; echo foo >&3
exec 3>f; echo bar >&3
exec 3>&- # close fd 3
cat f
(o arquivo é aberto e truncado exec
antes de cada um echo
).