让bash脚本回答交互式提示[重复]


109

是否有可能让bash脚本自动处理通常会以默认操作呈现给用户的提示?当前,我正在使用bash脚本调用内部工具,该工具将向用户显示提示(提示输入Y / N)以完成操作,但是我编写的脚本必须完全“放手”,因此我需要一种发送Y|N到提示符的方法,以允许程序继续执行。这可能吗?


这不是“自动完成” ...就像@unwind说的那样,这是“自动化”
benzaita 2012年

3
使用的实例yes:要做到这一点unix.stackexchange.com/questions/47344/...
Droogans

Answers:


65

这不是“自动完成”,而是自动化。一种用于这些事情的常用工具称为Expect

您也可能只需要通过管道输入就可以了yes


3
不幸的是,我不能使用Expect,因为它们对运行此程序的系统有严格的空间要求,所以我无法添加额外的程序包,但是通过管道yes进行操作就可以了,幸运的是,所有提示都只需要'y'。谢谢。
TJ L

但是Yes | command可能并不总是有效。如果仅用于安装目的,那么我会选择使用-y更好和首选的选项。
Umesh Kaushik

169

一个简单的

echo "Y Y N N Y N Y Y N" | ./your_script

这使您可以将任何“ Y”或“ N”序列传递给脚本。


3
如果我需要发送任何N,我会使用这种方法,但是我只需要Y,所以我选择了yes。太糟糕了,我不能接受两个答案,因为它们都是正确的。
TJ L 2010年

3
;)好吧,如果您需要发送一些N邮件,现在您有个很好的方法。
卢瓦克FEVRIER

2
这对我不起作用;空格不算作新行-例如,如果我回显“ Y N”,则它将字符串"Y N"作为输入提供给第一个提示,并挂在第二个提示上,等待我完成它。我尝试将空格更改为换行符,但这也不起作用,仍然在提示中输入了文字字符串。
临时用户名

52
尝试使用printf 'y\ny\ny\n' | ./your_script。这样,您将为每个预期的条目手动插入换行符。
Majid

8
printf '%s\n' Y Y N N Y N Y Y N在项目之间插入换行符,但不需要一个大格式字符串。
Charles Duffy

16

我发现发送输入的最佳方法是使用cat和文本文件传递所需的任何输入。

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

预期未达到我的预期。这是对这个问题最简单,最好的答案。
cloudxix

12

如果您只有Y可以发送:

$> yes Y |./your_script

如果您只有N个要发送:

$> yes N |./your_script

9

在我的情况下,我需要回答一些不带Y或N但带文本或空白的问题。我发现在这种情况下最好的方法是创建一个shellscript文件。就我而言,我将其称为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 ...实际上,您可以回答空白!

希望这可以帮助某人。


4

为此有一个特殊的内置实用程序-' ”。

要用相同的答案回答所有问题,可以运行

yes [answer] |./your_script

或者您可以将其放在脚本中,对每个问题有特定的答案


我如何在脚本中执行此操作?我的意思是为每个问题指定不同的答案
Sengo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.