2017-01-31 4 views

Antwort

2

Wenn Sie the tty manual page lesen Sie werden sehen, es sagt:

Drucken der Dateiname des Terminals verbunden Standardeingabe.

Emphasis Mine

Da Sie die Standardeingabe umleiten meldet eine Datei dann der tty Befehl sein, dass es nicht zu einem tty verbunden ist.

1

Die tty sieht, dass die Standardeingabe angewiesen wurde, da sie innerhalb einer Schleife liegt, deren Standardeingabe von einer Datei umgeleitet wurde.

Sie können erreichen, was Sie versuchen, indem Sie einen anderen Dateideskriptor anstelle des als "Standard in" (Dateideskriptor 0) geltenden verwenden.

while IFS= read -r -u 5 line 
do 
    tty 
done 5< file 

Die -u 5 Option teilt read von Dateideskriptor zu lesen 5. Die 5< Umleitung weist Bash den Inhalt der Datei zu nehmen und es mit Dateideskriptor 5.

zur Verfügung stellen

Diese Technik ist sehr nützlich, wenn Sie Es muss vermieden werden, Standardeingaben in einer Schleife zu erfassen, z. B. wenn Sie Benutzereingaben haben möchten.

Es funktioniert auch mit Prozess Substitution, die die Ausgabe eines beliebigen Befehl erlaubt das Umleiten:

while IFS= read -r -u 5 line 
do 
    tty 
done 5< <(any_command with arguments) 

In diesem Fall ist <() ein Ausdruck, der eine FIFO spezielle Datei erstellt, führt den angegebenen Befehl und führt die Ausgabe dieses Befehls als Eingabe in den FIFO. Der Ausdruck erzeugt einen Dateinamen (einen tatsächlichen Pfad zum FIFO), und diese Datei wird wie jede andere Datei für die Umleitung gelesen.

Dies ist normalerweise besser als die Verwendung einer Pipe für die while-Schleife, da das Innere der Schleife im selben Kontext wie der Rest des Skripts ausgeführt wird, um eine Untershell zu vermeiden: Variablenzuweisungen innerhalb der Schleife sind daher sichtbar Schleife endet.

Verwandte Themen