¿Por qué la lectura funciona si la entrada estándar se redirige a fd4?

¿Por qué la lectura funciona si la entrada estándar se redirige a fd4?

¿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é readsigue funcionando? ¿No debería estar vacío?

Respuesta1

Redirige stdin (FD0) a FD4, redirige desde /etc/XX/cfgFD0, 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/cfgSerí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/cfgdentro stdin, lo que terminará en fd4.

read line1Luego 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 stdina 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.

información relacionada