从文件中获取标准输入,但仍显示在终端中


9

我有一个程序,要求我在程序运行时输入数据。想象一下这样的事情:

$ ./program
Hi there. What's your name? Zambezi
What is your quest? To make a program which runs nicely
What is your favourite color? Red
...

现在,我有许多测试输入可以运行我的程序。它们都包含以下内容:

Arthur, King of the Britons
To seek the Holy Grail
...

但是,我的一些测试脚本失败了,不幸的是,对于我来说,很难准确地确定它们失败的原因,因为我的终端看起来像这样:

$ ./program < arthur.txt
Hi there. What's your name?What is your quest?What is your favourite color?...

有没有办法我仍然可以stdin通过文件输入,但是仍然显示终端,好像我已经全部输入了一样?

如果重要的话,Linux Mint 16是我的操作系统。


我不知道该怎么做,但是您“应该”能够使用(无缓冲)tty设备来做到这一点。有关某些线索,请参见stackoverflow.com/questions/8514735/…

Answers:


13

与其使用输入重定向(./program <arthur.txt)(它只是缓冲输入到程序中的内容),不如使用“期望”等工具等待问题并逐个发送答案。

#!/usr/bin/expect
log_user 0
spawn ./program
log_user 1

expect {
  "*?"
}
send "Arthur, King of the Britons\r"

expect {
  "*?"
}
send "To seek the Holy Grail\r"

expect {
  "*?"
}
send "...\r"

更好的示例:http : //www.pantz.org/software/expect/expect_examples_and_tips.html


完成上述工作后,您可以将其演变为一个expect脚本,该脚本知道什么提示您的程序出现问题,并知道响应“您最喜欢的颜色是什么?”向第三行输入程序。问题—然后让expect脚本读取arthur.txt文件(或任何其他指定的适当结构的文件)以获取这些输入,而不是在脚本中进行硬编码。
G-Man说'恢复莫妮卡'

7

这正是tee用途。

例如:

$  echo foo | tee >( grep bar ) 
foo
$

此处发生的是tee接收stdin并将其复制到stdout并再次通过管道将其输出。就像在管道的接头处一样。

有关更多详细信息,请查看联机帮助tee(1)。


1
但是,是否保证消息以正确的顺序出现?即使忽略缓冲,这实际上是两个程序同时运行并试图写入同一屏幕。
Federico Poloni 2015年

1
但是在我的场景中如何使用它呢?我尝试阅读联机帮助页,但是该工具似乎不仅是用例,而且还有很多其他用途,并且当涉及到program.exe和时,我还不太了解如何使用它arthur.txt
赞比西河2015年

@赞比西河cat arthur.txt | tee >( program.exe )
gronostaj 2015年

2
T恤也是我想到的第一件事。但是我已经尝试过并确认它不起作用。输出将单独显示。在我的实验中,首先显示arthur.txt的内容,然后显示来自program.exe的问题。您可能可以使它与期望的“ unbuffer”一起使用,但是我没有任何运气。
一些用户
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.