dado este fragmento:
exec 3>f
echo foo >&3
echo bar >&3
cat f # returns foo bar
¿Por qué bash se agrega a f? ¿Me estoy perdiendo de algo?
fuente
dado este fragmento:
exec 3>f
echo foo >&3
echo bar >&3
cat f # returns foo bar
¿Por qué bash se agrega a f? ¿Me estoy perdiendo de algo?
Lo que falta es que solo está abriendo (y truncando) el archivo f
una vez, en la exec
llamada. Los dos echo
comandos simplemente escriben en un descriptor de archivo ya abierto. Por f
lo tanto, el archivo no se truncará con ninguna echo
llamada.
Para redirigir la salida estándar a un descriptor de archivo, la sintaxis es >&n
donde n
hay algún pequeño entero positivo que denota el descriptor de archivo (no hay >>&n
redirección). El descriptor de archivo ya debe estar asociado con un archivo abierto para que esto funcione. Es el acto de abrir el archivo y asociarlo con un descriptor exec 3>f
que trunca el archivo ( exec 3>>f
no habría truncado el archivo y lo habría abierto en modo append). Simplemente escribir con >&3
no abre el archivo ni lo trunca.
Hubiera sido diferente si lo hubieras hecho
echo foo >f
echo bar >f
cat f
(cada uno echo
se abre y trunca f
), o, más complicado,
exec 3>f; echo foo >&3
exec 3>f; echo bar >&3
exec 3>&- # close fd 3
cat f
(el archivo se abre y se trunca exec
antes de cada uno echo
).