Bash: la lecture de l'entrée pendant que la boucle de lecture ne fonctionne pas

L'entrée de lecture dans une boucle while read ne semble pas fonctionner

while read line do echo "get some input from the user" read response done < some_file.txt 

L'exécution ne s'arrête pas, car il aurait été lu en dehors de la boucle. Pourquoi est-ce? Existe-t-il une solution de contournement pour la lecture de l'entrée dans une boucle while read?

Le problème est que la read line et la read response attendent (et obtiennent) des données de stdin .
Cette question sur SO explique une partie de celle-ci avec un lien pour encore plus d'informations.

Tl dr
La réponse acceptée suggère:

Lire à partir du périphérique de terminal de contrôle: read input </dev/tty

Laissez la commande de lecture interne utiliser stdin et utilisez un descripteur de fichier différent pour la boucle while

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

Nifle a exactement raison. Lorsque vous utilisez plusieurs terminaux, vous devez être spécifique.

Pour ceux d'entre vous venant de Google, félicitations pour avoir trouvé cette page. Si vous devez effectuer une entrée par un utilisateur durant une boucle de lecture (ceci inclut rm -i , read ou autre chose), vous pouvez spécifier le canal d'entrée à utiliser.

Voici un fragment de cette solution que j'ai utilisée:

 #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 

Merci Nifle! Et aussi grâce à bgStack. Après avoir cherché des heures, j'ai finalement obtenu la réponse! Elle est bonne!! J'ai utilisé "echo $ (tty)" pour détecter mon chemin du terminal ou vous le considérez simplement comme variable. Pour moi, c'était un autre cas d'utilisation. U lisait un fichier et souhaitais confirmer l'exécution. Peut-être que l'exemple ci-dessous aide quelqu'un d'autre.

 #!/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