¿Qué significa el siguiente guión?
exec 4<&0 0</etc/XX/cfg
read line1
exec 0<&4
Redirige fd0 a fd4 y "/etc/XX/cfg" a fd0.
Entonces, ¿por qué read
sigue funcionando? ¿No debería estar vacío?
Respuesta1
Redirige stdin (FD0) a FD4, redirige desde /etc/XX/cfg
FD0, lee una línea de FD0 y luego mueve FD4 de regreso a FD0. En resumen, guarda, reemplaza y restaura la entrada estándar, mientras lee una línea de un archivo intermedio.
read line1 < /etc/XX/cfg
Sería mucho más fácil, pero es imposible saber si es un reemplazo válido basándose únicamente en el código que se muestra.
Respuesta2
Para reformular esto en llamadas al sistema (usando C):
exec 4<&0 0</etc/XX/cfg
/* Duplicate fd0 as fd4. */
dup2 (0, 4);
/* Open file on fd0.
"open" always uses lowest available descriptor, so we don't need to check it. */
close (0);
open ("/etc/XX/cfg", O_RDONLY);
exec 0<&4
/* Close fd0 and duplicate fd4 as fd0. */
dup2 (4, 0);
Respuesta3
La forma en que leo esto, según la sección de la página de manual de bash sobre REDIRECCIÓN, es que stdin
(fd0) se redirige a fd4, luego la entrada se toma de /etc/XX/cfg
dentro stdin
, lo que terminará en fd4.
read line1
Luego se debe tomar de fd4, que luego se vuelve a colocar en fd0.
Una demostración podría mostrar un poco mejor lo que quiero decir y responder "por qué" podría hacer esto. Agregando otra línea y poniéndola en un contenedor:
$ vim ./test.sh
#!/bin/bash
exec 4<&0 0</etc/XX/cfg
read line1 # reads from fd4
exec 0<&4
read line2 # reads from fd0
echo $line1
echo $line2
Puede canalizar o redirigir stdin
a través de test.sh pero también leer la configuración mediante redirección, por lo que en el código anterior extraje valores de "config" (suposición de mi parte basada en el nombre del archivo - malo :)), pero También se puede procesar a través de stdin.
p.ej:
$ ./test.sh < somefile
$ cat somefile | ./test.sh
Ojalá esto lo explique.