Ich habe ein Bash-Skript, das ungefähr so aussieht:
cat filename | while read line
do
read input;
echo $input;
done
Dies gibt mir jedoch eindeutig nicht die richtige Ausgabe, da beim Lesen in der while-Schleife aufgrund der möglichen E / A-Umleitung versucht wird, aus dem Dateinamen der Datei zu lesen.
Gibt es eine andere Möglichkeit, dasselbe zu tun?
bash
while-loop
w2lame
quelle
quelle
Antworten:
Lesen Sie vom steuernden Endgerät:
Weitere Informationen: http://compgroups.net/comp.unix.shell/Fixing-stdin-inside-a-redirected-loop
quelle
bash yourscript < /foo/bar
für die Benutzereingabe wartet, dann ist dies nur dann akzeptabel , wenn Passwörter zu lesen. Die Antwort von @GordonDavisson ist für alle anderen Zwecke vorzuziehen.Sie können den regulären Standard durch Einheit 3 umleiten, um ihn in der Pipeline zu behalten:
Übrigens, wenn Sie
cat
diese Methode wirklich verwenden , ersetzen Sie sie durch eine Weiterleitung, und die Dinge werden noch einfacher:Oder Sie können stdin und unit 3 in dieser Version austauschen - lesen Sie die Datei mit unit 3 und lassen Sie stdin einfach in Ruhe:
quelle
read line
das Lesen von Benachrichtigung beendet ist, aber wenn Sie es nur so ausführen, wie es geschrieben wurde,read -u 3 input
wird von der Konsole gelesen)?Versuchen Sie, die Schleife folgendermaßen zu ändern:
Gerätetest:
quelle
Es sieht so aus, als würden Sie zweimal lesen. Das Lesen in der while-Schleife wird nicht benötigt. Außerdem müssen Sie den Befehl cat nicht aufrufen:
quelle
read
Verhalten des Inneren als "nicht richtig [weil] es versucht, aus der Datei zu lesenfilename
") als auch aus ihrer akzeptierten Antwort hervor.Ich habe diesen Parameter -u mit read gefunden.
"-u 1" bedeutet "von stdin lesen"
quelle
quelle