让 Bash 脚本回答交互式提示

166

有没有可能使用Bash脚本自动处理通常由默认操作呈现给用户的提示?目前,我正在使用Bash脚本调用内部工具来向用户显示提示(提示Y / N)以完成操作,但我编写的脚本需要完全“无人干预”,因此我需要一种方法将 Y | N 发送到提示以允许程序继续执行。这可行吗?


1
这不是“自动完成”...就像@unwind所说的那样,它是“自动化”。 - benzaita
3
使用 yes 命令进行这个操作的示例:http://unix.stackexchange.com/questions/47344/the-yes-command#comment65866_47344 - yurisich
使用printf和管道到脚本。 printf "yes\nNO\nYes" | ./questions.sh - Linden X. Quan
6个回答

242
一个简单的。
echo "Y Y N N Y N Y Y N" | ./your_script

这允许您向脚本传递任何“Y”或“N”序列。


3
如果我需要发送任何N,我会使用这种方法,但是我只需要Y,所以我选择了“yes”。很遗憾我不能接受两个答案,因为它们都是正确的。 - TJ L
4
如果您需要发送一些“N”,现在您有一个好办法可以做到。 - Loïc Février
2
这对我不起作用;空格不算作新行---例如,如果我回显“Y N”,那么它会将字符串“Y N”作为第一个提示的输入,并在第二个提示上挂起等待我完成它。我尝试将空格更改为换行符,但也没有起作用,仍然向提示提供了一个字面字符串。 - temporary_user_name
65
尝试使用 printf 'y\ny\ny\n' | ./your_script,这样你就可以手动插入每个预期条目的换行符。 - Majid
19
printf '%s\n' Y Y N N Y N Y Y N 会在每个项目之间添加换行符,而无需一个大的格式字符串。 - Charles Duffy
显示剩余3条评论

82

这不是“自动补全”,而是自动化。其中一种常见的工具称为Expect

你也可以尝试将输入从yes进行管道传输来完成该操作。


3
很遗憾,由于系统空间有限制,我不能使用"expect"。但是通过将 "yes" 输入管道中,问题得到了解决。幸运的是,所有提示都只需要输入'y'。谢谢。 - TJ L
然而,“Yes | command”并不总是有效。如果只是为了安装目的,那么我认为使用“-y”是更好和更受欢迎的选择。 - Umesh Kaushik
2
Expect 能够应对密码提示吗?例如,git pull 需要我输入用户名和密码。密码不会显示在屏幕上,而是隐藏的。Expect 能够处理这个问题吗? - Xbox One
@XboxOne:我几乎可以肯定答案是“是的”(据我回忆,我认为我已经用expect做过了),但如果你在StackOverflow或Unix.SE上搜索这个问题,我相信它已经被问过了。而且我很确定你可以很容易地找到它的例子。在评论中提问通常不会得到好的答案。 - iconoclast

41

如果你只有 Y 可以发送:

$> yes Y |./your_script

如果你只有 N 可以发送:

$> yes N |./your_script

23

我发现发送输入的最佳方式是使用cat和一个文本文件,将需要输入的内容传递给它。

cat "input.txt" | ./Script.sh

2
Expect在我的情况下没有按预期工作。这是这个问题的最简单和最好的答案。 - cloudxix
这里cat是无用的; 你需要 ./Script.sh <input.txt. - tripleee
1
@tripleee:如果您不关心可读性和从左到右的逻辑流程,那么cat命令才是无用的。另一种选择是否更高效是另一回事,但严格来说,不能说cat没有价值。这就是为什么尽管有很多抱怨,仍然有很多人使用它的原因。 - iconoclast

13
在我的情况下,我需要回答一些问题,但不能只用是或否的形式,而是需要用文本或空白来回答。我发现在我的情况下最好的方法是创建一个shell脚本文件。在我的情况下,我把它叫做autocomplete.sh。
我需要为一个教义模式导出器回答一些问题,所以我的文件看起来像这样。
-- 这只是一个示例 --
php vendor/bin/mysql-workbench-schema-export mysqlworkbenchfile.mwb ./doctrine << EOF
`#Export to Doctrine Annotation Format`                                     1
`#Would you like to change the setup configuration before exporting`        y
`#Log to console`                                                           y
`#Log file`                                                                 testing.log
`#Filename [%entity%.%extension%]`
`#Indentation [4]`
`#Use tabs [no]`
`#Eol delimeter (win, unix) [win]`
`#Backup existing file [yes]`
`#Add generator info as comment [yes]`
`#Skip plural name checking [no]`
`#Use logged storage [no]`
`#Sort tables and views [yes]`
`#Export only table categorized []`
`#Enhance many to many detection [yes]`
`#Skip many to many tables [yes]`
`#Bundle namespace []`
`#Entity namespace []`
`#Repository namespace []`
`#Use automatic repository [yes]`
`#Skip column with relation [no]`
`#Related var name format [%name%%related%]`
`#Nullable attribute (auto, always) [auto]`
`#Generated value strategy (auto, identity, sequence, table, none) [auto]`
`#Default cascade (persist, remove, detach, merge, all, refresh, ) [no]`
`#Use annotation prefix [ORM\]`
`#Skip getter and setter [no]`
`#Generate entity serialization [yes]`
`#Generate extendable entity [no]`                                          y
`#Quote identifier strategy (auto, always, none) [auto]`
`#Extends class []`
`#Property typehint [no]`
EOF
我喜欢这种策略的原因是你可以评论你的答案,并且使用 EOF 换行符就可以表示空白行(默认答案)。顺便说一句,这个导出工具有自己的 JSON 对应项来回答这些问题,但我在完成这个之后才知道 =)。 要运行脚本,只需在您想要的目录中运行终端中的 'sh autocomplete.sh'。
简而言之,通过使用 << EOL 和 EOF 与换行符相结合,您可以根据需要回答提示中的每个问题。每一行都是一个新的答案。 我的例子只是展示了如何使用注释以及使用 ` 字符,以便您记住每个步骤。 请注意,此方法的另一个优点是您可以用更多的内容回答,而不仅仅是 Y 或 N ...实际上,您可以用空白回答! 希望这对某人有所帮助。

13

有一个特殊的内置工具可以实现这个功能 - 'yes'。

要用相同的答案回答所有问题,您可以运行以下命令:

yes [answer] |./your_script

或者你可以将它放在你的脚本中,对每个问题都有特定的答案。


2
我该如何在脚本中实现这个?我的意思是为每个问题指定不同的答案。 - Sengo
这对我也很有用。 - Nathaniel Rink
是的,$'hello\ngoodbye\nso long' 会无限循环遍历这三个字符串。($'...' 这种 "C 字符串" 表示法是 Bash 特有的;但在任何 Bourne 兼容的 shell 中,您都可以使用常规单引号和字面换行符。) - tripleee
yes $(date|md5sum) | security add-generic-password -s facebook -a xx.yy -w 可以在不需要输入密码的情况下将密码添加到钥匙串中。 - DawnSong

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接