I am running a script (I can't edit it), and there are three yes/no questions. How can I automatically respond to these questions? I need to answer yes, yes, no (in that order).
2 Answers
Try this:
echo -e "yes\nyes\nno" | /path/to/your/script
From help echo
:
-e
: enable interpretation of the following backslash escapes

- 84,225
- 14
- 89
- 153
Pipe to Standard Input
Some scripts can take replies from standard input. One of the many ways to do this would be:
$ printf "%s\n" yes yes no | ./foo.sh
yes yes no
This is simple and easy to read, but relies on how your script internals handle standard input, and if you can't edit the target script that can sometimes be a problem.
Use Expect for Interactive Prompts
While you can sometimes get away with using standard input, interactive prompts are generally better handled by tools like Expect. For example, given a script foo.sh, you can write foo.exp to automate it.
Note: You can also use autoexpect to create a a script from an interactive session, which you can then edit if necessary. I'd highly recommend this for people new to Expect.
Bash Script: foo.sh
This is the script you might want to automate.
#!/usr/bin/env bash
for question in Foo Bar Baz; do
read -p "${question}? "
replies=("${replies[@]}" "$REPLY")
done
echo "${replies[@]}"
Expect Script: foo.exp
Here is a simplistic Expect script to automate the Bash script above. Expect loops, branching, and regular expressions can provide much more flexibility than this oversimplified example shows, but it does show how easy a minimal Expect script can be!
#!/usr/bin/env expect
spawn -noecho /tmp/foo.sh
expect "Foo? " { send -- "1\r" }
expect "Bar? " { send -- "2\r" }
expect "Baz? " { send -- "3\r" }
interact
Sample Interactive Session
This is what your interactive session will look like when you run the Expect script. It will spawn your Bash script, and respond as instructed to each different prompt.
$ /tmp/foo.exp
Foo? 1
Bar? 2
Baz? 3
1 2 3

- 81,402
- 15
- 141
- 199
-
1what if the questions are not in any specific order? – Dee Aug 02 '18 at 10:51
-
Does expect halt the progression of the script, or does it spawn it in the background while the script continues? – artomason Oct 28 '22 at 16:00
-
1@Dee That's a totally different question than the one posed by the OP. Expect can handle multiple expectations, regexps with alternation, and branching logic, but if you have a specific use case you need to open a related question. – Todd A. Jacobs Oct 28 '22 at 20:45
-
@artomason That's a completely different question than the one the OP asked. Tcl (and therefore Expect) have a `spawn` command. If you want to spawn background processes, set timeouts, or do other blocking/non-blocking stuff you'll need to open a separate question. – Todd A. Jacobs Oct 28 '22 at 20:46