如何获取bash脚本以响应另一个交互式脚本?

时间:2015-05-27 22:38:44

标签: bash

我在工作中使用了一个命令行节点脚本,在运行时,会在执行前一个接一个地询问一系列提示。例如:

$ npm run-script scriptname
    Give me some information:
    <me typing stuff and pressing enter>
    Give me some more information:
    <me typing some more stuff and pressing enter>
    Now running script.
    Script complete.
$

我正在尝试编写一个自动填充这些字段的bash脚本,但我不知道该怎么做。所以在bash脚本中我做了:

 npm run-script scriptname

但在那之后,我需要处理交互式输入阶段,我不知道如何或谷歌要找出什么。有没有人知道如何做到这一点?

使用echo "info1 info2" | npm run-script scriptname只需将字符串"info1 info2"提供给第一个提示符,然后挂起第二个提示符等待我完成它。将空格更改为换行符会产生相同的行为。

3 个答案:

答案 0 :(得分:2)

你是如何添加换行符的?如果你做了

echo "info1\ninfo2" | npm run-script scriptname

不起作用,因为\n是文字字符\n。而是使用其中一个:

echo $'info1\ninfo2' | npm run-script scriptname
echo -e "info1\ninfo2" | npm run-script scriptname

第一个告诉bash将\n解释为换行符;第二个人echo做了解释。

传递多行输入的另一种方法是使用here document syntax

npm run-script scriptname <<INPUT
info1
info2
INPUT

如果这些都不起作用那么这意味着你正在运行的程序不是从stdin读取,而是直接从tty读取。 SSH故意这样做会使密码输入自动化变得更加困难,因为在脚本中使用密码是一个主要的安全漏洞。

如果那就是发生了什么,那么我的第一个建议就是想出另一种方法来让程序做你想做的事。它可能有一个很好的理由,它避免了stdin。也许有可用于控制它的命令行标志或配置文件。

如果没有,那么您可以使用Expect

  

Expect是一个自动交互式应用程序的工具,如telnet,f​​tp,passwd,fsck,rlogin,tip等。期待真的让这些东西变得微不足道......

     

期望可以轻松完成各种其他任务非常困难的任务。你会发现Expect是一个绝对宝贵的工具 - 使用它,你将能够自动执行你以前从未想过的任务 - 并且你将能够快速,轻松地完成这种自动化。

答案 1 :(得分:1)

你可以尝试

echo -e "info1\ninfo2" | npm run-script scriptname

答案 2 :(得分:0)

仅仅是为了完整性,因为在任何其他答案中都没有提到它,这可能是最简单的方法:

echo "info1
info2" | npm run-script scriptname

也应该有用(你只需在打开后按下)。