¿Cómo entender el comando "cat> file_name << blah"?

13

En el siguiente comando cat toma el contenido de here-doc y lo redirige a un archivo llamado conf:

cat > conf << EOF
var1="cat"
var2="dog"
var3="hamster"
EOF

¿Cómo entender el orden de los comandos aquí? ¿ bashPrimero procesa todo lo demás (parte here-doc) y como paso final se ve la > confparte?

Martín
fuente

Respuestas:

17

Here-Document es un tipo de redirección de shell, por lo que el shell lo realizará como redireccionamiento normal, de principio a fin (o de izquierda a derecha, u orden de aparición). Esto está definido por POSIX:

Si se especifica más de un operador de redirección con un comando, el orden de evaluación es de principio a fin.


En su comando, catrealizará > confprimero, abrirá y truncará el confarchivo para escribir, luego leerá los datos Here-Document.

Utilizando strace, puedes verificarlo:

$ strace -f -e trace=open,dup2 sh -c 'cat > conf << EOF
var1="cat"
var2="dog"
var3="hamster"
EOF
'
...
open("conf", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
dup2(3, 1)                              = 1
dup2(3, 0)                              = 0
...
Cuonglm
fuente
Veo. Entonces, básicamente, ¿qué sucede en caso de cat > file_name << blahque antes de ejecutar catel stdout de shell esté conectado al archivo nombrado file_namey luego stdin of shell esté conectado a here-doc ?
Martin
@ Martin: Sí. Puedes ver que openfue llamado antes dup2.
Cuonglm
12

Bueno, descubramos:

unset file
cat >"$file" <<EOF
this is not in ${file=./myfile}
EOF

bash: : No such file or directory

Dang Supongo que debe estar haciendo la >"$file"parte primero entonces. Pero que si...?

unset file
<<EOF cat >"$file"
this is in ${file=./myfile}
EOF

...No hay error...?

cat ./myfile

this is in ./myfile

Como parece, el orden importa.

mikeserv
fuente
-1

Cuando se bashcrea el proceso para ejecutarse cat, se abre confpara escribir en el descriptor de archivo 1 y abre un archivo temporal (para el documento aquí) para leer en el descriptor de archivo 0, antes de execiniciar el programa. En este caso, realmente no importa en qué orden suceden esas acciones.

El orden se vuelve significativo cuando se reasignan los descriptores de archivo, por ejemplo, con 2>&1.

Toby Speight
fuente