如何在 bash 脚本中自动回答 y?

Sha*_*son 32 bash

我想通过 bash 脚本卸载一些程序。运行命令后,终端询问我是否确定要卸载它。所以我需要回答y。我想自动完成并y在延迟 10 秒后回答。

我做了这个例子,但它不起作用 -

#!/usr/bin
/opt/MNG/MNGVIEWHP/fe/uninstall
sleep 10
echo "y"
Run Code Online (Sandbox Code Playgroud)

任何的想法?Centos 7.2

Sté*_*las 73

这就是yes命令的用途。它y无限期地每行输出一个,因此它可以通过管道传输到询问是/否问题的命令。

yes | /opt/MNG/MNGVIEWHP/fe/uninstall
Run Code Online (Sandbox Code Playgroud)

那就是y所有问题的答案。要回答n所有问题,请替换yesyes n。对于预定义的组合yn,可以替换yes使用:

printf '%s\n' y n n y y n...
Run Code Online (Sandbox Code Playgroud)

或者运行它:

/opt/MNG/MNGVIEWHP/fe/uninstall << 'EOF'
y
n
n
y
y
n
EOF
Run Code Online (Sandbox Code Playgroud)

如果您确实需要在 10 秒之前无法阅读答案,您可以这样做:

(sleep 10; echo y; sleep 2; echo n;...) | /opt/MNG/MNGVIEWHP/fe/uninstall
Run Code Online (Sandbox Code Playgroud)

但这可能没有必要,当我们写入y管道时,uninstall只要它想读取它就会在那里读取它,您不太可能需要等待它准备好读取它。例外情况是如果uninstall决定在提出问题之前刷新输入。

所有这些都假设uninstall命令只是将每个答案读取为来自其标准输入的一行输入。

对于更复杂的情况,命令直接从 tty 设备读取答案,或者您需要有条件地提供答案(例如,基于命令输出的内容),这就是您使用expectzsh's 之类的地方zpty

请注意,许多交互式程序在传递某些选项时可以进入某种非交互式模式。在花费太多精力解决问题之前,您可能需要先查看他们的手册。

  • @ShalevSason,在我提供的所有解决方案中,例如使用 `echo "y"`,我们每次都编写 `y&lt;newline&gt;`,模拟您按 `y` 后按 Enter。如果你想模拟单独按 Enter 键,那将输入一个空行,所以 `printf '%s\n' yn '' 2 3`(其中 `''` 是空行)。 (3认同)