Cómo utilizar el comando "leer" en un script de Shell que lee sus argumentos desde la entrada estándar

Cómo utilizar el comando "leer" en un script de Shell que lee sus argumentos desde la entrada estándar

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.

información relacionada