Por que o redirecionamento do bash para um arquivo acontece no modo de acréscimo

8

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?

user374819
fonte

Respostas:

19

O que está faltando é que você está abrindo (e truncando) o arquivo apenas fuma vez, na execchamada. Os dois echocomandos estão apenas gravando em um descritor de arquivo já aberto. O arquivo f, portanto, não será truncado por nenhuma das echochamadas.

Para redirecionar a saída padrão para um descritor de arquivo, a sintaxe é >&nonde nestá um pequeno número inteiro positivo que indica o descritor de arquivo (não há >>&nredirecionamento). 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>fque trunca o arquivo ( exec 3>>fnão teria truncado o arquivo e o teria aberto no modo de acréscimo). Apenas escrever com >&3nã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 execantes de cada um echo).

Kusalananda
fonte