Wie erhält man nach jeder Iteration der While-Schleife eine Eingabeaufforderung?

Wie erhält man nach jeder Iteration der While-Schleife eine Eingabeaufforderung?

Ich möchte nach jeder Schleifeniteration eine Eingabeaufforderung.

BEISPIEL: Wenn eine Iteration durchgeführt wird, brauche ich Press Enter to continueund 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 -pinnerhalb 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 lineLesevorgang 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 lineexplizit darum, vonDasDateideskriptor, statt von seiner Standardeingabe (Dateideskriptor 0). Dadurch bleibt die Standardeingabe frei und der read -pliest 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 linewird die Datei über die normale Standardeingabe gelesen, die aus der Schleife geerbt wurde, während read -paus Dateideskriptor 3 gelesen wird. Dateideskriptor 3 wird als Kopie der Standardeingabe geöffnet, bevor die Standardeingabe von der Datei umgeleitet wird.

In der bashSchale,

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

verwandte Informationen