![Wie erhält man nach jeder Iteration der While-Schleife eine Eingabeaufforderung?](https://rvso.com/image/154475/Wie%20erh%C3%A4lt%20man%20nach%20jeder%20Iteration%20der%20While-Schleife%20eine%20Eingabeaufforderung%3F.png)
Ich möchte nach jeder Schleifeniteration eine Eingabeaufforderung.
BEISPIEL: Wenn eine Iteration durchgeführt wird, brauche ich Press Enter to continue
und dann noch einmal nach der zweiten Iteration, noch einmal nach der dritten und so weiter.
Ich verwende read -p " Press enter to continue "
(aber dies wird übersprungen).
while read line
do
echo "$line" logs""
echo " "
echo "`tail -100 Domain1."$line"`"
read -p "Press enter to continue"
done<input.txt
Antwort1
Ihr read -p
innerhalb der Schleife wird "übersprungen" (nicht wirklich), weil es von liest input.txt
. Alle Befehle innerhalb der Schleife erben standardmäßig ihren Standardeingabestrom von der Schleife, und dies ist verbunden mitinput.txt
Stattdessen müssen Sie den read line
Lesevorgang aus einem neuen Eingabedateideskriptor durchführen und den Dateiinhalt darüber übermitteln lassen:
while IFS= read -r line <&3; do
printf '%s logs\n\n' "$line"
tail -n 100 "Domain1.$line"
read -p 'Press Enter to continue'
done 3<input.txt
Hier verwenden wir Dateideskriptor 3 (den nächsten freien und verfügbaren Dateideskriptor nach den Standarddeskriptoren) und verbinden ihn mit der Eingabedatei. Wir bitten dann read line
explizit darum, vonDasDateideskriptor, statt von seiner Standardeingabe (Dateideskriptor 0). Dadurch bleibt die Standardeingabe frei und der read -p
liest wie üblich von dort.
Alternativ können Sie die Eingabedateideskriptoren aus der obigen Schleife vertauschen:
while IFS= read -r line; do
printf '%s logs\n\n' "$line"
tail -n 100 "Domain1.$line"
read -p 'Press Enter to continue' <&3
done 3<&0 <input.txt
Jetzt read line
wird die Datei über die normale Standardeingabe gelesen, die aus der Schleife geerbt wurde, während read -p
aus Dateideskriptor 3 gelesen wird. Dateideskriptor 3 wird als Kopie der Standardeingabe geöffnet, bevor die Standardeingabe von der Datei umgeleitet wird.
In der bash
Schale,
read <&3
könnte auch geschrieben werden
read -u 3
Die „sauberste“ Lösung (im Sinne der geringsten Menge an Dateideskriptor-Jongliersyntax) könnte also etwa so aussehen:
while IFS= read -u 3 -r line; do
printf '%s logs\n\n' "$line"
tail -n 100 "Domain1.$line"
read -p 'Press Enter to continue'
done 3<input.txt