En primer lugar, gracias de antemano por su ayuda y lo siento si esto fue respondido antes. No he podido encontrarlo.
Para ayudar a entender mi pregunta, he escrito el siguiente script simple llamado "list_server_owners" (es inútil, pero es sólo un ejemplo):
#!/bin/bash
SERVER_LIST=""
SERVER_LIST="$(cat) " # This reads from stdin
for SERVER in $SERVER_LIST
do
echo -n "Please, write the server's owner: "
read OWNER
echo "${SERVER}'s owner is $OWNER"
done
Tengo el siguiente archivo de texto llamado "server_list":
Server1
Server2
Y este es el resultado del script que pasa "server_list" a través de stdin:
$ cat server_list | list_server_owner
Please, write the server's owner: Server1's owner is
Please, write the server's owner: Server2's owner is
El problema es fácil de describir: la línea del script "leer PROPIETARIO" no funciona como me gustaría. El nombre del propietario del servidor no se solicita en la pantalla.
¿Sabes cómo puedo hacer que el comando "leer" solicite una cadena en la pantalla?
Respuesta1
El archivo /dev/tty es sinónimo de la terminal de control del proceso, así que simplemente redirija la entrada desde ese dispositivo:
...
read OWNER </dev/tty
...
También puede redirigir la salida del mensaje de eco anterior a /dev/tty, y luego poder usar el script en una tubería:
#!/bin/bash
while read SERVER # this reads from stdin
do
echo -n "Please, write the server's owner: " >/dev/tty
read OWNER </dev/tty
echo "$SERVER:$OWNER" # write to stdout
done
Y usar como:
cat server_list | assign_owner > server_owner
Respuesta2
He encontrado la solución.
Tienes que agregar haz esto:
MY_TTY=$(ps -ef | grep -m 1 $$ | awk '{print $6}')
read OWNER </dev/${MY_TTY}
Respuesta3
Otra posibilidad, y para mí es la más sencilla:
exec 0</dev/tty
read OWNER
Con esto, no necesita especificar la entrada estándar en todos los comandos de "lectura" a lo largo del script.
Estaba confundido porque si escribes el comando "tty" dentro del script no hay salida, pero, como dice el último comentario (gracias), se reconoce el archivo especial /dev/tty.