Bash: Das Lesen der Eingabe innerhalb der Leseschleife funktioniert nicht

14

Das Lesen der Eingabe innerhalb einer while-Leseschleife 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, als wäre der Lesevorgang außerhalb der Schleife gewesen. Warum ist das? Gibt es eine Problemumgehung für das Lesen von Eingaben innerhalb einer while-Leseschleife?

Naja eigentlich
quelle

Antworten:

15

Das Problem ist , dass beide read lineund read responseerwartet (und wird) Daten aus stdin.
Diese Frage zu SO erklärt einige davon mit einem Link zu noch mehr Informationen.

tl; dr
Die akzeptierte Antwort schlägt vor:

Lesen Sie vom steuernden Endgerät: read input </dev/tty

Nifle
quelle
16

Lassen Sie den inneren Lesebefehl stdin verwenden und einen anderen Dateideskriptor für die while-Schleife verwenden

while read -u 3 line; do
  read -p "get some input from the user" response
done 3< some_file.txt
Glenn Jackman
quelle
1

Nifle hat es genau richtig. Wenn Sie jedoch mehrere Terminals verwenden, müssen Sie spezifisch sein.

Für diejenigen unter Ihnen, die von Google kommen, herzlichen Glückwunsch zum Auffinden dieser Seite. Wenn Sie irgendeine Benutzereingabe während einer während Leseschleife tun müssen (dies umfasst rm -i, readoder irgendetwas anderes), können Sie angeben , welches Eingangsrohr zu verwenden.

Hier ist ein Fragment dieser Lösung, die 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
bgStack15
quelle
1

Danke Nifle! Und auch dank bgStack. Nachdem ich stundenlang gesucht hatte, bekam ich endlich die Antwort! Tolle Sache!! Ich habe "echo $ (tty)" verwendet, um meinen Terminalpfad zu erkennen, oder Sie nehmen ihn einfach als Variable. Für mich war es ein anderer Anwendungsfall. U hat eine Datei gelesen und möchte die Ausführung bestätigen. Vielleicht hilft das folgende Beispiel jemand anderem.

#!/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
Micha
quelle
In meinem Fall hatte ich das whileLesen aus einer Pipe ... und dann habe ich die Umleitung verwendet, um von stdin zu lesen : read something < %terminal.
eftshift0