【问题标题】:How can I respond to prompts in a Linux Bash script automatically? [duplicate]如何自动响应 Linux Bash 脚本中的提示? [复制]
【发布时间】:2017-04-09 01:34:40
【问题描述】:

我正在运行一个脚本(我无法编辑它),并且有三个是/否问题。我怎样才能自动回答这些问题?我需要回答是,是,否(按此顺序)。

【问题讨论】:

    标签: linux bash automation prompt


    【解决方案1】:

    试试这个:

    echo -e "yes\nyes\nno" | /path/to/your/script
    

    来自help echo

    -e:启用对以下反斜杠转义的解释

    【讨论】:

      【解决方案2】:

      标准输入管道

      某些脚本可以从标准输入中获取回复。执行此操作的众多方法之一是:

      $ printf "%s\n" yes yes no | ./foo.sh 
      yes yes no
      

      这简单易读,但取决于您的脚本内部如何处理标准输入,以及您是否无法编辑有时可能成为问题的目标脚本。

      将 Expect 用于交互式提示

      虽然您有时可以避免使用标准输入,但交互式提示通常由Expect 之类的工具处理得更好。例如,给定一个脚本 foo.sh,您可以编写 foo.exp 来自动化它。

      注意:您还可以使用 autoexpect 从交互式会话中创建一个脚本,然后您可以在必要时对其进行编辑。我强烈推荐给 Expect 的新手。

      Bash 脚本:foo.sh

      这是您可能想要自动化的脚本。

      #!/usr/bin/env bash
      for question in Foo Bar Baz; do
          read -p "${question}? "
          replies=("${replies[@]}" "$REPLY")
      done
      echo "${replies[@]}"
      

      期望脚本:foo.exp

      这是一个简单的 Expect 脚本,用于自动化上面的 Bash 脚本。 Expect 循环、分支和正则表达式可以提供比这个过于简单的示例显示的更多的灵活性,但它确实显示了最小的 Expect 脚本是多么容易!

      #!/usr/bin/env expect
      spawn -noecho /tmp/foo.sh
      expect "Foo? " { send -- "1\r" }
      expect "Bar? " { send -- "2\r" }
      expect "Baz? " { send -- "3\r" }
      interact
      

      交互式会话示例

      这就是您运行 Expect 脚本时交互式会话的样子。它将生成您的 Bash 脚本,并按照指示响应每个不同的提示。

      $ /tmp/foo.exp 
      Foo? 1
      Bar? 2
      Baz? 3
      1 2 3
      

      【讨论】:

      • 如果问题没有任何特定顺序怎么办?
      猜你喜欢
      • 1970-01-01
      • 2021-02-02
      • 1970-01-01
      • 1970-01-01
      • 2010-12-25
      • 2020-04-02
      • 2016-10-17
      • 2015-09-02
      • 2010-09-05
      相关资源
      最近更新 更多