【问题标题】:Have bash script answer interactive prompts [duplicate]让 bash 脚本回答交互式提示 [重复]
【发布时间】:2020-09-20 07:27:54
【问题描述】:

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

【问题讨论】:

  • 这不是“自动完成”......就像@unwind 所说,它是“自动化”
  • 使用yes 执行此操作的示例:unix.stackexchange.com/questions/47344/…
  • 使用 printf 和管道到脚本。 printf "是\n否\n是" | ./questions.sh

标签: linux bash automation command-prompt prompt


【解决方案1】:

一个简单的

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

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

【讨论】:

  • 如果我需要发送任何N,我会使用这种方法,但我只需要Y,所以我选择了yes。太糟糕了,我不能接受两个答案,因为它们都是正确的。
  • ;) 如果您需要发送一些 N,那么您现在有一个好方法。
  • 这对我不起作用;空格不算作新行——例如,如果我回显“Y N”,那么它将字符串"Y N" 作为第一个提示的输入并挂在第二个提示上等待我完成它。我尝试将空格更改为换行符,但这也不起作用,仍然给提示符提供了一个文字字符串。
  • 尝试使用printf 'y\ny\ny\n' | ./your_script。这样您就可以为每个预期条目手动插入换行符。
  • printf '%s\n' Y Y N N Y N Y Y N 在项目之间添加换行符,但不需要一个大格式字符串。
【解决方案2】:

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

您也可以只使用来自@987654322@ 的管道输入。

【讨论】:

  • 不幸的是,我不能使用 expect,因为它们对运行它的系统有严格的空间要求,所以我不能添加额外的包,但是管道 yes 成功了,幸运的是所有提示都只有无论如何都需要一个'y'。谢谢。
  • 但是Yes | command 可能并不总是有效。如果只是出于安装目的,那么我使用-y 是一个更好和首选的选择。
  • Expect可以回答密码提示吗?例如,git pull 要求我输入用户名和密码。密码不显示在屏幕上,它是隐藏的。 Expect 可以管理吗?
【解决方案3】:

如果你只有 Y 要发送:

$> yes Y |./your_script

如果你只有 N 个要发送:

$> yes N |./your_script

【讨论】:

    【解决方案4】:

    我发现发送输入的最佳方式是使用 cat 和一个文本文件来传递您需要的任何输入。

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

    【讨论】:

    • Expect 对我来说没有按预期工作。这是对这个问题的最简单和最好的答案。
    • 这里的cat is useless;你想要./Script.sh <input.txt
    【解决方案5】:

    在我的情况下,我需要回答一些没有 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'

    简而言之,通过使用 结合Return Lines,您可以根据需要回答提示的每个问题。 每一行都是一个新的答案。

    我的示例只是展示了如何使用 cmets 完成此操作,同时使用 ` 字符,以便您记住每个步骤是什么。

    请注意,此方法的另一个优点是您可以用 Y 或 N 来回答……事实上,您可以用空格来回答!

    希望这对某人有所帮助。

    【讨论】:

      【解决方案6】:

      为此有一个特殊的内置工具 - 'yes'。

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

      yes [answer] |./your_script
      

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

      【讨论】:

      • 如何在脚本中做到这一点?我的意思是为每个问题指定不同的答案
      • 这对我也有用
      • yes $'hello\ngoodbye\nso long' 永远迭代这三个。 ($'...' "C string" 表示法是 Bash 特有的;但您可以在任何与 Bourne 兼容的 shell 中使用常规单引号和文字换行符。)
      猜你喜欢
      • 2017-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-26
      • 1970-01-01
      • 2019-05-06
      相关资源
      最近更新 更多