Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

reading multiple items semi-interactively from the user in bash

Tags:

bash

stdin

I'm trying to read multiple items from the user in a shell script, with no luck. The intention is to read a list of files first (which are read from the stdin pipe), and then read twice more to get two strings interactively. What I'm trying to do is read a list of files to attach in an email, then the subject and finally the email body.

So far I have this:

photos=($(< /dev/stdin))

echo "Enter message subject"
subject=$(< /dev/stdin)

echo "Enter message body"
body=$(< /dev/stdin)

(plus error checking code that I omit for succintness)

However, this gets an empty subject and body presumably because the second and third redirections get EOF.

I've been trying to close and reopen stdin with <&- and stuff but it doesn't seem to work that way.

I even tried using a separator for the list of files, using a "while; read line" loop and break out of the loop when the separator was detected. But that didn't work either (??).

Any ideas how to build something like this?

like image 577
alvherre Avatar asked Jan 02 '10 18:01

alvherre


1 Answers

So what I ended up doing is based on ezpz's answer and this doc: http://www.faqs.org/docs/abs/HTML/io-redirection.html Basically I prompt for the fields first from /dev/tty, and then read stdin, using the dup-and-close trick:

# close stdin after dup'ing it to FD 6
exec 6<&0

# open /dev/tty as stdin
exec 0</dev/tty

# now read the fields
echo "Enter message subject"
read subject
echo "Enter message body"
read body

# done reading interactively; now read from the pipe
exec 0<&6 6<&-
photos=($(< /dev/stdin))

Thanks!

like image 73
alvherre Avatar answered Sep 18 '22 14:09

alvherre