Usando `read` en el script bash de la tubería

0

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 curlo wget.

Pero aparentemente, no se puede usar readen 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: $HELLOimprimirá 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 $HELLOqueda vacío. También intenté agregar la -iopción en bash, y no funcionó.

¿Hay alguna forma de que podamos usar readen la secuencia de comandos canalizada? ¿Cómo? O, si no podemos, ¿por qué?

Koala Yeung
fuente
1
Posible duplicado de datos
muru

Respuestas:

3

read"interactuará" con el usuario a través de stdin (donde leerá cosas) y stderr (donde imprimirá su -pmensaje, si lo hay).

Si el stdin es el script , readobtendrá sus cosas de él, haciendo que salte una línea:

$ echo '
read foo
what the -)(*$;?
echo "$foo"
' | bash
what the -)(*$;?

Esta no es una buena práctica y no funcionará en todos los depósitos. También bashtenga 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 readconstrucción solo obtendrá EOF y no establecerá ninguna variable.

Si desea readleer siempre desde el tty controlador, rediríjalo explícitamente:

read var </dev/tty

Esto también debe usarse con moderación. Nadie lo apreciará si tiene que usarlo expect(1)para instrumentar su guión.

Mosvy
fuente