Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Read stdin for user input when a file is already redirected to stdin [duplicate]

Tags:

bash

So I'm trying to do something like the following:

while read line; do
    read userInput
    echo "$line $userInput"
done < file.txt

So say file.txt has:

Hello?
Goodbye!

Running the program would create:

Hello?
James
Hello? James
Goodbye!
Farewell
Goodbye! Farewell

The issue (naturally) becomes that the userinput read reads from stdin which in our case is file.txt. Is there a way to change where it's reading from temporarily to the terminal in order to grab user input?

Note: The file I am working with is 200,000 lines long. and each line is about 500 chars long. So keep that in mind if needed

like image 307
Aram Papazian Avatar asked Jan 16 '12 21:01

Aram Papazian


1 Answers

Instead of using redirection, you can open file.txt to a file descriptor (for example 3) and use read -u 3 to read from the file instead of from stdin:

exec 3<file.txt
while read -u 3 line; do
    echo $line
    read userInput
    echo "$line $userInput"
done

Alternatively, as suggested by Jaypal Singh, this can be written as:

while read line <&3; do
    echo $line
    read userInput
    echo "$line $userInput"
done 3<file.txt

The advantage of this version is that it also works in sh (the -u option for read doesn't work in sh).

like image 180
jcollado Avatar answered Oct 22 '22 00:10

jcollado