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

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

我是运行脚本(不能编辑),有3道yes/no题。我怎样才能自动回答这些问题?我需要回答是,是,否(按顺序)。

试试这个:

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

来自help echo

-e: enable interpretation of the following backslash escapes

管道到标准输入

一些脚本可以从标准输入中获取回复。执行此操作的众多方法之一是:

$ 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 循环、分支和正则表达式可以提供比这个过度简化的示例显示的更多的灵活性,但它确实显示了一个最小的 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