Bash: чтение входных данных внутри цикла while read не работает

Bash: чтение входных данных внутри цикла while read не работает

Чтение входных данных в цикле while read, похоже, не работает

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

Выполнение не останавливается, как если бы чтение было вне цикла. Почему так? Есть ли обходной путь для чтения ввода внутри цикла while read?

решение1

Проблема в том, что read lineи read responseожидает (и получает) данные из stdin.
Этот вопросна SO некоторые из них объясняются со ссылкой на еще более подробную информацию.

вкратце
Принятый ответ предполагает:

Считывание с управляющего терминального устройства:read input </dev/tty

решение2

позвольте внутренней команде чтения использовать stdin и используйте другой файловый дескриптор для цикла while

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

решение3

Спасибо Nifle! И также спасибо bgStack. После часов поиска я наконец получил ответ! Отличный ответ!! Я использовал "echo $(tty)", чтобы определить свой путь к терминалу, или вы просто принимаете его как переменную. Для меня это был другой вариант использования. Вы читали файл и хотели бы подтвердить выполнение. Возможно, пример ниже поможет кому-то еще.

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

решение4

Nifle абсолютно прав. Однако, когда вы используете несколько терминалов, вам нужно быть конкретным.

Для тех из вас, кто пришел из Google, поздравляю с нахождением этой страницы. Если вам нужно сделать какой-либо пользовательский ввод во время цикла while read (включая rm -i, read, или что-либо еще), вы можете указать, какой входной канал использовать.

Вот фрагмент решения, который я использовал:

#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

Связанный контент