134
votes

I have a bash script that employs the read command to read arguments to commands interactively, for example yes/no options. Is there a way to call this script in a non-interactive script passing default option values as arguments?

It's not just one option that I have to pass to the interactive script.

5
If it is reading from stdin you could pipe in your input - lc.
As this question gets many duplicates, it is worth pointing out that it doesn't matter in which language the interactive program is written. It could be a C program which reads standard input, or an Erlang application, or whatever. There's something which runs from the command line and obnoxiously demands interactive input, and you'd like to automate it. - tripleee
Of course, if you have control over the obnoxious application, rewrite it so that it can read the answers noninteractively (through a configuration file, command-line options, or whatever). This is much more reliable and robust against changing the order or wording of interactive questions. - tripleee

5 Answers

169
votes

Many ways

pipe your input

echo "yes
no
maybe" | your_program

redirect from a file

your_program < answers.txt

use a here document (this can be very readable)

your_program << ANSWERS
yes
no
maybe
ANSWERS

use a here string

your_program <<< $'yes\nno\nmaybe\n'
50
votes

For more complex tasks there is expect ( http://en.wikipedia.org/wiki/Expect ). It basically simulates a user, you can code a script how to react to specific program outputs and related stuff.

This also works in cases like ssh that prohibits piping passwords to it.

14
votes

You can put the data in a file and re-direct it like this:

$ cat file.sh
#!/bin/bash

read x
read y
echo $x
echo $y

Data for the script:

$ cat data.txt
2
3

Executing the script:

$ file.sh < data.txt
2
3
9
votes

Just want to add one more way. Found it elsewhere, and is quite simple. Say I want to pass yes for all the prompts at command line for a command "execute_command", Then I would simply pipe yes to it.

yes | execute_command

This will use yes as the answer to all yes/no prompts.

6
votes

You can also use printf to pipe the input to your script.

var=val
printf "yes\nno\nmaybe\n$var\n" | ./your_script.sh