【问题标题】:Passing arguments to an interactive program non-interactively以非交互方式将参数传递给交互式程序
【发布时间】:2013-01-01 18:51:25
【问题描述】:

我有一个 bash 脚本,它使用 read 命令以交互方式读取命令的参数,例如是/否选项。有没有办法在传递默认选项值作为参数的非交互式脚本中调用此脚本?

这不仅仅是我必须传递给交互式脚本的一个选项。

【问题讨论】:

  • 如果它是从标准输入读取的,您可以通过管道输入您的输入
  • 由于这个问题有很多重复,值得指出的是,交互式程序是用哪种语言编写的并不重要。它可以是读取标准输入的 C 程序,也可以是 Erlang 应用程序,或其他任何东西。有一些东西从命令行运行,并且令人讨厌地需要交互式输入,而您希望将其自动化。
  • 当然,如果您可以控制令人讨厌的应用程序,请重写它,以便它可以非交互方式(通过配置文件、命令行选项或其他方式)读取答案。这对于更改交互式问题的顺序或措辞更加可靠和稳健。

标签: bash interactive non-interactive


【解决方案1】:

您还可以使用 printf 将输入通过管道传输到您的脚本。

var=val
printf "yes\nno\nmaybe\n$var\n" | ./your_script.sh

【讨论】:

  • 这就是拯救我的原因。谢谢@spanchan。
  • 我不明白为什么,但是使用printf 对某些程序(例如wml)有效,而其他技术都没有。
【解决方案2】:

只想再添加一种方式。在别处找到的,很简单。 假设我想在命令行中为命令“execute_command”的所有提示传递“是”,然后我只需将“是”传递给它。

yes | execute_command

这将使用是作为所有是/否提示的答案。

【讨论】:

    【解决方案3】:

    对于更复杂的任务,有expect (http://en.wikipedia.org/wiki/Expect)。 它基本上模拟了一个用户,你可以编写一个脚本来对特定的程序输出和相关的东西做出反应。

    这也适用于像ssh 这样禁止向其输入密码的情况。

    【讨论】:

    • ...虽然在 SSH 案例中正确的解决方案是切换到公钥身份验证。
    【解决方案4】:

    多种方式

    管道输入

    echo "yes
    no
    maybe" | your_program
    

    从文件重定向

    your_program < answers.txt
    

    使用here document(这样可读性很强)

    your_program << ANSWERS
    yes
    no
    maybe
    ANSWERS
    

    使用here string

    your_program <<< $'yes\nno\nmaybe\n'
    

    【讨论】:

    • 需要指出的是,这仅在程序读取标准输入时才有效。有些程序会不厌其烦地阅读,例如交互式密码,即使标准输入是管道。对于密码,出于安全原因,这是有意义的;虽然有些互动程序只是设计得很糟糕。
    • @tripleee 按照您所说的,脚本如何读取不受标准输入影响的密码?我知道你可以使用read来获取标准输入,你可以用什么函数来做你描述的?
    • 在这种情况下,您需要查看您尝试与之交互的程序是否有特殊的方式来向其发送输入(例如 sshpass、ssh-agent),或者使用 expect 来编写脚本互动。
    • Expect 之类的程序所做的就是在一个伪 tty 下运行客户端,在客户端看来,就像在另一端有一个带有终端和键盘的用户一样。你不能用普通管道做到这一点。
    • 重要通知。如果我们在提供的命令中添加空格,这将不起作用。
    【解决方案5】:

    您可以将数据放入文件中并像这样重定向它:

    $ cat file.sh
    #!/bin/bash
    
    read x
    read y
    echo $x
    echo $y
    

    脚本数据:

    $ cat data.txt
    2
    3
    

    执行脚本:

    $ file.sh < data.txt
    2
    3
    

    【讨论】:

    • 这就是答案,也告诉我们如何处理来自任何来源的输入,完美
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-17
    • 1970-01-01
    • 2013-01-01
    • 1970-01-01
    相关资源
    最近更新 更多