Bash: Das Lesen von Eingaben innerhalb einer while-read-Schleife funktioniert nicht

Bash: Das Lesen von Eingaben innerhalb einer while-read-Schleife funktioniert nicht

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 lineals read responseauch 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, readoder 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

verwandte Informationen