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?

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


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

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

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

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.