How can I respond to prompts in a Linux Bash script automatically?

28,132

Solution 1

Try this:

echo -e "yes\nyes\nno" | /path/to/your/script

From help echo:

-e: enable interpretation of the following backslash escapes

Solution 2

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
Share:
28,132
Ron
Author by

Ron

Updated on July 09, 2022

Comments

  • Ron
    Ron almost 2 years

    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).

  • Dee
    Dee almost 6 years
    what if the questions are not in any specific order?