28

The bash read command is very convenient for:

  • read -p to prompt the user and capture input from the user
  • while read loop to iterate through the lines of a file.

However, I'm having issues attempting to do both simultaneously.

For example:

#!/bin/bash

while read item
do
    echo Item: $item
    read -p "choose wisely: " choice
    echo You still have made a $choice.
done < /tmp/item.list 

Rather than blocking and standing by for the user to enter a choice, bash is populating $choice with the next item in the item.list file.

Does bash support doing a read nested within a read loop?

2
  • 2
    The two things to keep in mind are 1) the inner loop inherits its file descriptors from the outer loop, and 2) you can use other file descriptors than standard input. Commented Apr 30, 2013 at 20:44
  • possible duplicate of bash: nested interactive read within a loop that's also using read Commented Jul 30, 2014 at 7:03

1 Answer 1

42

The simplest fix is to have the outer read read from a different file descriptor instead of standard input. In Bash, the -u option make that a little easier.

while read -u 3 item
do
  # other stuff
  read -p "choose wisely: " choice
  # other stuff
done 3< /tmp/item.list
Sign up to request clarification or add additional context in comments.

1 Comment

Just changing read -p "choose wisely: " choice to read -p "choose wisely: " choice < /dev/tty should also work.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.