2013-01-18 61 views
52

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

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

+2

如果从标准你可以管你输入 –

+2

由于这个问题得到读取重复很多,值得指出的是,它并不重要的语言交互程序被写入。它可能是一个读取标准输入或Erlang应用程序的C程序,或其他任何程序。有些东西是从命令行运行的,并且令人讨厌地要求交互式输入,并且您希望将其自动化。 – tripleee

回答

22

如需更多e复杂任务有expecthttp://en.wikipedia.org/wiki/Expect)。 它基本上模拟一个用户,你可以编写一个脚本如何对特定的程序输出和相关的东西作出反应。

这也适用于像ssh这种情况,禁止管道密码。

+3

...虽然在SSH情况下适当的解决方案是切换到公钥认证。 – tripleee

11

你可以把数据放到一个文件并重新引导它像这样:

$ cat data.txt 
2 
3 

执行脚本:

$ file.sh < data.txt 
2 
3 
88

为脚本
$ cat file.sh 
#!/bin/bash 

read x 
read y 
echo $x 
echo $y 

数据多种方式

管道y我们的输入

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' 
+2

它指出,这只有在程序读取标准输入时才有效。有些程序会自行阅读,例如交互式密码,即使标准输入是管道。对于密码,这是安全的原因;尽管一些交互式程序设计简单。 – tripleee

+0

@tripleee除了你所说的线路,如何脚本读取不受标准输入密码?我知道你可以使用'read'来获取标准输入,你可以用什么函数来执行你描述的内容? – flow2k

+0

在这种情况下,你需要看,如果你想与之交互的程序必须输入发送给它一个特殊的方式(例如sshpass,SSH代理),或使用期望脚本的相互作用。 –

3

只是想添加一个更多的方法。在别处找到它,而且很简单。 假设我想在命令行中为命令“execute_command”传递所有提示的yes,那么我只需向它输入yes即可。

yes | execute_command 

这将使用yes作为所有yes/no提示的答案。