如何自动响应Linux Bash脚本中的提示?

时间:2016-11-24 17:00:11

标签: linux bash automation prompt

我正在运行一个脚本(我无法编辑它),并且有三个是/否问题。我该如何自动回答这些问题?我需要回答是,是,否(按此顺序)。

2 个答案:

答案 0 :(得分:12)

试试这个:

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

答案 1 :(得分:10)

管道到标准输入

某些脚本可以从标准输入中获取回复。其中一种方法是:

$ printf "%s\n" yes yes no | ./foo.sh 
yes yes no

这很简单易读,但依赖于脚本内部如何处理标准输入,以及您是否可以编辑有时可能存在问题的目标脚本。

使用Expect进行交互式提示

虽然有时可以使用标准输入,但通常可以通过Expect等工具更好地处理交互式提示。例如,给定一个脚本 foo.sh ,您可以编写 foo.exp 来自动化它。

注意:您还可以使用 autoexpect 从交互式会话创建脚本,然后可以根据需要进行编辑。我强烈建议那些刚接触Expect的人。

Bash脚本:foo.sh

这是您可能想要自动化的脚本。

#!/usr/bin/env bash
for question in Foo Bar Baz; do
    read -p "${question}? "
    replies=("${replies[@]}" "$REPLY")
done
echo "${replies[@]}"

期待脚本:foo.exp

这是一个简单的Expect脚本,用于自动化上面的Bash脚本。期望循环,分支和正则表达式可以提供比这个过度简化的示例更多的灵活性,但它 显示最小的Expect脚本是多么容易!

#!/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

交互式会话示例

这是运行Expect脚本时交互式会话的样子。它将生成您的Bash脚本,并按照每个不同提示的指示进行响应。

$ /tmp/foo.exp 
Foo? 1
Bar? 2
Baz? 3
1 2 3