非交互地将参数传递给交互式程序


113

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

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


2
如果从标准你可以管你输入读数
LC。

4
由于这个问题有很多重复,值得指出的是,交互式程序以哪种语言编写都没有关系。它可以是读取标准输入的C程序,也可以是Erlang应用程序,等等。有一些从命令行运行的东西,讨厌地要求交互式输入,而您想使它自动化。
点钟

当然,如果您可以控制令人讨厌的应用程序,请对其进行重写,以便它可以非交互方式(通过配置文件,命令行选项或其他方式)读取答案。这对于更改交互式问题的顺序或措词更加可靠和强大。
Tripleee '18

Answers:



154

很多方法

用管道输入

echo "yes
no
maybe" | your_program

从文件重定向

your_program < answers.txt

使用此处文档(此文档可能非常可读)

your_program << ANSWERS
yes
no
maybe
ANSWERS

使用here字符串

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

5
需要指出的是,这仅在程序读取标准输入时才有效。即使标准输入是管道,某些程序也无法以交互方式读取例如密码。对于密码,出于安全原因,这是有意义的。尽管某些交互式程序设计得很差。
tripleee

@tripleee按照您所说的内容,脚本如何读取不受stdin影响的密码?我知道您可以read用来获取标准输入,您可以使用什么功能执行您所描述的?
flow2k

在这种情况下,您需要查看要与之交互的程序是否具有将输入发送给它的特殊方法(例如sshpass,ssh-agent),或使用Expect编写交互脚本。
格伦·杰克曼

2
像Expect这样的程序会在伪tty下运行客户端,在该tty下,客户端看起来就像是在另一端有一个终端和一个键盘的用户。您不能使用常规管道来做到这一点。
人间

重要通知。如果我们在提供的命令中添加空格,这将不起作用。
71GA

13

您可以将数据放入文件中,然后重新定向,如下所示:

$ cat file.sh
#!/bin/bash

read x
read y
echo $x
echo $y

脚本的数据:

$ cat data.txt
2
3

执行脚本:

$ file.sh < data.txt
2
3

7

只想增加一种方法。在其他地方找到它,并且非常简单。假设我想在命令行中为命令“ execute_command”的所有提示传递“是”,那么我只需将“是”传递给它。

yes | execute_command

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


1

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

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

0

另一个可以是

echo "something" | tee /path/to/file

tee命令将收到的输入打印到屏幕上,并同时将其保存到文件中。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.