如何编写安装程序的“是”响应脚本?


112

我使用Amazon Linux实例,并且有几个脚本来填充数据并安装我使用的所有程序,但是有几个程序会问:

Do you want to continue [Y/n]?

并暂停安装。我想在所有情况下都自动回答“ Y”,我现在确定该怎么做。


3
程序包管理器可能会带有--noprompt--noconfirm标志。
Blender

Answers:


208

“是”命令将回声“Y”(或任何你问它)无限期。用作:

yes | command-that-asks-for-input

或者,如果要求大写字母“ Y”:

yes Y | command-that-asks-for-input

这仅适用于支持某些命令以使用yes的输入的命令,不是吗?我从OpenStack看了一眼,但没有成功,我认为Expect在所有情况下都更加精确
HVNSweeting 2012年

1
//,如果必须输入完整的单词“是”怎么办?
弥敦道(Nathan Basanese)2015年

1
要小心,yes因为它会最大限度地利用CPU。 stackoverflow.com/a/18164007/720665
David Salamon

真好 这使我的生活变得更加轻松。:D 还在搜索-ybash脚本的是HARD。
内森·史密斯

1
@DavidSalamon仅在写入不受限制的内容(例如/dev/nullSTDOUT)时才如此。通过管道传递给命令时,每次接收命令读取到一条命令时,它将仅向管道写入一行,否则将等待。
沃尔夫,

68

echo y | command 应该管用。

另外,某些安装程序具有“自动赞成”标志。它是-y用于apt-get在Ubuntu。


我试图做回声“ giturl no” | jspm注册表在我的shell脚本中创建Registry_name jspm-git。但它不断失败。同时输入giurl。任何想法?
manismku

另一个示例:在docker-compose中,存在-f--force)标志,对于删除某些内容的命令,它的作用是“自动”
路加福音

如果提示多次要求确认,您如何递归“回显Y”?
萨法克·奥兹坎'18

18

您可能无法在目标服务器上安装Expect。当有人写一份詹金斯的工作时,通常就是这种情况。

如果是这样,我会在askubuntu.com上考虑类似以下内容的答案:

/ubuntu/338857/automatically-enter-input-in-command-line

printf 'y\nyes\nno\nmaybe\n' | ./script_that_needs_user_input

请注意,在极少数情况下,该命令不需要用户在字符后按Enter。在这种情况下,请省略换行符:

printf 'yyy' | ./script_that_needs_user_input

为了完整起见,您还可以使用here文档:

./script_that_needs_user_input << EOF
y
y
y
EOF

或者,如果您的外壳支持此字符串,则为:

./script <<< "y
y
y
"

或者,您可以创建一个文件,每行一个输入:

./script < inputfile

同样,此答案的全部功劳归于 Lesmana 在askubuntu.com的答案作者。


//,如果您喜欢此答案,请确保支持askubuntu.com用户@lesmana。
弥敦道(Nathan Basanese)'17

6

尽管这可能比您想要的更复杂/更重,但一种非常灵活的方法是使用Expect(或另一种编程语言中的一种派生方法)之类的方法。

Expect是一种专门用于控制基于文本的应用程序的语言,这正是您要执行的操作。如果您最终需要做一些更复杂的事情(例如使用逻辑来实际决定下一步要做什么/回答),那么Expect是您的最佳选择。



3

如果您只想接受默认值,则可以使用:

\n | ./shell_being_run

//,这意味着您将接受默认值吗?
弥敦道(Nathan Basanese)

2
bashsh最系统,这是我知道的,你需要echo\n,否则它不会通过管道输送到下一个命令。
2i3r
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.