有bash脚本回答交互提示

tj1*_*111 95 linux bash automation prompt command-prompt

是否可以让bash脚本自动处理通常以默认操作呈现给用户的提示?目前我正在使用bash脚本来调用内部工具,该工具将向用户显示提示(提示Y/N)以完成操作,但是我写的脚本需要完全"不干涉",所以我需要一种方法发送Y|N到提示,以允许程序继续执行.这可能吗?

Loï*_*ier 148

一个简单的

echo "Y Y N N Y N Y Y N" | ./your_script
Run Code Online (Sandbox Code Playgroud)

这允许您将任何"Y"或"N"序列传递给脚本.

  • 尝试使用`printf'y \ny \ny \n'| ./ your_script`.这样您就可以为每个预期的条目手动插入换行符. (44认同)
  • `printf'%s \ n'YYNNYNYYN`在项目之间插入换行符,但是不需要一个大格式的字符串。 (4认同)
  • 如果我需要发送任何"N",我会使用这种方法,但我只需要Y,所以我选择了"是".太糟糕了,我不能接受两个答案,因为它们都是正确的. (3认同)
  • ;)好吧,如果你需要发送一些'N`,你现在有一个很好的方法来做到这一点. (3认同)
  • 这对我不起作用;空格不算作新行-例如,如果我回显“ Y N”,则它将字符串“ Y N”作为输入输入到第一个提示,并挂在第二个提示上,等待我完成它。我尝试将空格更改为换行符,但这也不起作用,仍然在提示中输入了文字字符串。 (2认同)
  • @danielo,`sudo` 和 `ssh` 不是“普通的”——出于安全原因,它们从 TTY 提示,而不是标准输入。也就是说,你**真的**不应该使用 sudo 来运行 git。最好修复您的权限,以便您的常规用户帐户拥有所有涉及的文件;使用提升的权限进行版本控制操作意味着 git 0 中的安全错误会影响您的整个系统,而不仅仅是您的个人帐户。 (2认同)

unw*_*ind 63

这不是"自动完成",这是自动化.这些东西的一个常用工具叫做Expect.

您也可以从中输入管道输入yes.

  • 不幸的是我不能使用expect因为它们对运行它的系统有严格的空间要求所以我不能添加额外的包,但是管道"是"就可以了,幸运的是所有的提示只需要'y'.谢谢. (3认同)
  • “Expect”可以回答密码提示吗?例如,“git pull”要求我输入用户名和密码。密码不会显示在屏幕上,它是隐藏的。“Expect”能做到这一点吗? (2认同)

小智 12

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

cat "input.txt" | ./Script.sh
Run Code Online (Sandbox Code Playgroud)

  • Expect 没有按我的预期工作。这是这个问题最简单也是最好的答案。 (2认同)

dou*_*rdo 12

如果你只有Y发送:

$> yes Y |./your_script
Run Code Online (Sandbox Code Playgroud)

如果你只有N发送:

$> yes N |./yout_script
Run Code Online (Sandbox Code Playgroud)


Jos*_*han 8

在我的情况下,我需要回答一些没有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
Run Code Online (Sandbox Code Playgroud)

我喜欢这个策略的是你可以评论你的答案是什么,并使用EOF一个空行就是那个(默认答案).顺便说一下,这个导出工具有自己的JSON对应方式来回答这些问题,但是在我这样做之后我想出了这个=).

运行脚本只需在您想要的目录中并'sh autocomplete.sh'在终端中运行.

简而言之,通过将<< EOL&EOF 与Return Lines结合使用,您可以根据需要回答每个提示问题. 每个新行都是一个新答案.

我的例子只是展示了如何使用`字符进行注释,以便你记住每个步骤是什么.

注意这种方法的另一个优点是你可以用更多的答案来回答Y或N ...实际上你可以用空白来回答!

希望这有助于某人.


Asa*_*ssi 7

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

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

yes [answer] |./your_script
Run Code Online (Sandbox Code Playgroud)

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

  • 我怎样才能在脚本中做到这一点?我的意思是为每个问题指定不同的答案 (2认同)