Bash puede ejecutar scripts desde la tubería. Un ejemplo mínimo sería:
> echo "echo hello world" | bash
hello world
Esto es útil si desea ejecutar un script descargado desde curl
o wget
.
Pero aparentemente, no se puede usar read
en este tipo de ejecución de script. Por ejemplo,
#!/bin/bash
echo 'input: '
read HELLO
echo hello: $HELLO
Si simplemente ejecuta el script anterior desde un archivo de script bash, podría ingresar el valor de $HELLO
. y el echo hello: $HELLO
imprimirá el resultado.
Si alimenta la secuencia de comandos de la manera que hablamos anteriormente:
> echo "echo 'input: '; read HELLO; echo hello: $HELLO" | bash
input:
hello:
No obtendrás la interacción en absoluto. Y $HELLO
queda vacío. También intenté agregar la -i
opción en bash, y no funcionó.
¿Hay alguna forma de que podamos usar read
en la secuencia de comandos canalizada? ¿Cómo? O, si no podemos, ¿por qué?
Respuestas:
read
"interactuará" con el usuario a través de stdin (donde leerá cosas) y stderr (donde imprimirá su-p
mensaje, si lo hay).Si el stdin es el script ,
read
obtendrá sus cosas de él, haciendo que salte una línea:Esta no es una buena práctica y no funcionará en todos los depósitos. También
bash
tenga en cuenta que al canalizar scripts a través de stdin, tendrá que leerlos byte por byte.En su ejemplo, su secuencia de comandos completa era una sola línea, por lo que la
read
construcción solo obtendrá EOF y no establecerá ninguna variable.Si desea
read
leer siempre desde el tty controlador, rediríjalo explícitamente:Esto también debe usarse con moderación. Nadie lo apreciará si tiene que usarlo
expect(1)
para instrumentar su guión.fuente