我在工作中使用了一个命令行节点脚本,在运行时,会在执行前一个接一个地询问一系列提示。例如:
$ 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"
提供给第一个提示符,然后挂起第二个提示符等待我完成它。将空格更改为换行符会产生相同的行为。
答案 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,ftp,passwd,fsck,rlogin,tip等。期待真的让这些东西变得微不足道......
期望可以轻松完成各种其他任务非常困难的任务。你会发现Expect是一个绝对宝贵的工具 - 使用它,你将能够自动执行你以前从未想过的任务 - 并且你将能够快速,轻松地完成这种自动化。
答案 1 :(得分:1)
你可以尝试
echo -e "info1\ninfo2" | npm run-script scriptname
答案 2 :(得分:0)
仅仅是为了完整性,因为在任何其他答案中都没有提到它,这可能是最简单的方法:
echo "info1
info2" | npm run-script scriptname
也应该有用(你只需在打开后按下)。