
Das Einlesen von Eingaben innerhalb einer while-read-Schleife scheint nicht zu funktionieren
while read line
do
echo "get some input from the user"
read response
done < some_file.txt
Die Ausführung wird nicht angehalten, wie es der Fall wäre, wenn der Lesevorgang außerhalb der Schleife stattgefunden hätte. Warum ist das so? Gibt es eine Problemumgehung für das Lesen von Eingaben innerhalb einer while-read-Schleife?
Antwort1
Das Problem besteht darin, dass sowohl read line
als read response
auch Daten von erwarten (und erhalten) stdin
.
Diese Frageauf SO werden einige davon mit einem Link zu noch mehr Informationen erklärt.
tl;dr
Die akzeptierte Antwort schlägt vor:
Vom steuernden Endgerät lesen:
read input </dev/tty
Antwort2
Lassen Sie den inneren Lesebefehl stdin verwenden und verwenden Sie einen anderen Dateideskriptor für die While-Schleife
while read -u 3 line; do
read -p "get some input from the user" response
done 3< some_file.txt
Antwort3
Danke, Nifle! Und auch danke an bgStack. Nach stundenlanger Suche habe ich endlich die Antwort gefunden! Großartig!! Ich habe „echo $(tty)“ verwendet, um meinen Terminalpfad zu ermitteln, oder Sie nehmen ihn einfach als Variable. Für mich war es ein anderer Anwendungsfall. Sie haben eine Datei gelesen und möchten die Ausführung bestätigen. Vielleicht hilft das folgende Beispiel jemand anderem weiter.
#!/bin/bash
export terminal=$(tty)
cat file | while read val1 val2
do
while true;
do
read -p "would you like to XYZ" yn
case $yn in
[Yy]* ) echo "# Move $val1 to $val2 #";break;;
[Nn]* ) echo "#---------no action----------#";break;;
* ) echo "# Please answer yes or no. #";;
esac
done < $terminal
done
Antwort4
Nifle hat vollkommen recht. Wenn Sie jedoch mehrere Terminals verwenden, müssen Sie genau sein.
Für diejenigen unter Ihnen, die von Google kommen, herzlichen Glückwunsch, dass Sie diese Seite gefunden haben. Wenn Sie während einer while-Leseschleife eine Benutzereingabe vornehmen müssen (dazu gehören rm -i
, read
oder irgendetwas anderes), können Sie angeben, welche Eingabepipe verwendet werden soll.
Hier ist ein Ausschnitt dieser Lösung, den ich verwendet habe:
#in declarations
thistty=$(tty)
lsuser -R LDAP -a home pgrp ALL 2>/dev/null | while read line
do
homedir=$(echo $homedir | awk -F= '{print $2}')
sudo rm -ir "$homedir" < $thistty
done