How can I respond to prompts in a Linux Bash scrip

2019-02-13 13:53发布

This question already has an answer here:

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条回答
等我变得足够好
2楼-- · 2019-02-13 14:09

Try this:

echo -e "yes\nyes\nno" | /path/to/your/script
查看更多
该账号已被封号
3楼-- · 2019-02-13 14:22

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
查看更多
登录 后发表回答