
Чтение входных данных в цикле 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