Чтение stdin для ввода пользователем, когда файл уже перенаправлен на stdin
Итак, я пытаюсь сделать что-то вроде следующего:
while read line; do
read userInput
echo "$line $userInput"
done < file.txt
Итак, файл file.txt имеет:
Hello?
Goodbye!
Запуск программы создаст:
Hello?
James
Hello? James
Goodbye!
Farewell
Goodbye! Farewell
Проблема (естественно) заключается в том, что чтение userinput считывает из stdin, который в нашем случае является file.txt. Есть ли способ изменить, где он временно считывается на терминал, чтобы захватить пользовательский ввод?
Примечание. Файл, с которым я работаю, составляет 200 000 строк. и каждая строка имеет длину около 500 символов. Поэтому имейте это в виду, если необходимо
Ответы
Ответ 1
Вместо использования перенаправления вы можете открыть file.txt
в дескриптор файла (например, 3) и использовать read -u 3
для чтения из файла вместо stdin
:
exec 3<file.txt
while read -u 3 line; do
echo $line
read userInput
echo "$line $userInput"
done
В качестве альтернативы, как предлагает Jaypal Singh, это можно записать в виде:
while read line <&3; do
echo $line
read userInput
echo "$line $userInput"
done 3<file.txt
Преимущество этой версии заключается в том, что она также работает в sh
(опция -u
для read
не работает в sh
).