Чтение 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).