【发布时间】:2017-04-09 01:34:40
【问题描述】:
我正在运行一个脚本(我无法编辑它),并且有三个是/否问题。我怎样才能自动回答这些问题?我需要回答是,是,否(按此顺序)。
【问题讨论】:
标签: linux bash automation prompt
我正在运行一个脚本(我无法编辑它),并且有三个是/否问题。我怎样才能自动回答这些问题?我需要回答是,是,否(按此顺序)。
【问题讨论】:
标签: linux bash automation prompt
试试这个:
echo -e "yes\nyes\nno" | /path/to/your/script
来自help echo:
-e:启用对以下反斜杠转义的解释
【讨论】:
某些脚本可以从标准输入中获取回复。执行此操作的众多方法之一是:
$ printf "%s\n" yes yes no | ./foo.sh
yes yes no
这简单易读,但取决于您的脚本内部如何处理标准输入,以及您是否无法编辑有时可能成为问题的目标脚本。
虽然您有时可以避免使用标准输入,但交互式提示通常由Expect 之类的工具处理得更好。例如,给定一个脚本 foo.sh,您可以编写 foo.exp 来自动化它。
注意:您还可以使用 autoexpect 从交互式会话中创建一个脚本,然后您可以在必要时对其进行编辑。我强烈推荐给 Expect 的新手。
这是您可能想要自动化的脚本。
#!/usr/bin/env bash
for question in Foo Bar Baz; do
read -p "${question}? "
replies=("${replies[@]}" "$REPLY")
done
echo "${replies[@]}"
这是一个简单的 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
【讨论】: