Verwendung des Befehls "read" in einem Shell-Skript, das seine Argumente aus stdin liest

377
Lucas

Zunächst einmal vielen Dank für Ihre Hilfe im Voraus und für den Fall, dass dies zuvor beantwortet wurde. Ich konnte es nicht finden.

Um zu helfen, meine Frage zu verstehen, habe ich das folgende einfache Skript namens "list_server_owners" geschrieben (es ist nutzlos, aber es ist nur ein Beispiel):

#!/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 "$'s owner is $OWNER" done 

Ich habe die folgende Textdatei mit dem Namen "server_list":

Server1 Server2 

Und das ist die Ausgabe des Skripts, das "server_list" durch stdin weitergibt:

$ 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 

Das Problem ist einfach zu beschreiben: Die Zeile des Skripts "read OWNER" funktioniert nicht so, wie ich es gerne hätte. Der Name des Servers des Servers wird nicht auf dem Bildschirm angefordert.

Wissen Sie, wie ich mit dem Befehl "Lesen" eine Zeichenfolge auf dem Bildschirm anfordern kann?

-1

3 Antworten auf die Frage

0
Lucas

Ich habe die Lösung gefunden.

Sie müssen folgendes hinzufügen:

MY_TTY=$(ps -ef | grep -m 1 $$ | awk '') read OWNER </dev/$ 
0
PBI

Die Datei / dev / tty ist ein Synonym für das steuernde Terminal des Prozesses. Umleiten Sie einfach die Eingabe von diesem Gerät:

... read OWNER </dev/tty ... 

Sie können auch die Ausgabe der Echoaufforderung vor / dev / tty umleiten und dann das Skript in einer Pipe verwenden:

#!/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 

Und verwenden wie:

 cat server_list | assign_owner > server_owner 
0
user550897

Eine andere Möglichkeit, und es ist für mich die einfachste:

exec 0</dev/tty read OWNER 

Damit müssen Sie nicht die Standardeingabe für alle "read" -Befehle im Skript angeben.

Ich war verwirrt, weil, wenn Sie den Befehl "tty" in das Skript schreiben, keine Ausgabe erfolgt, aber wie im letzten Kommentar (Danke) angegeben, wird die spezielle Datei / dev / tty erkannt.