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.