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

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

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

$ ./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 就是我的操作系统。

答案1

您不应该使用输入重定向(./program < arthur.txt),它只是缓冲程序的输入,而应该使用“expect”之类的工具来等待问题并逐一发送答案。

#!/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

答案2

这正是tee用途所在。

例如:

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

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

查看手册页 tee(1) 以了解更多详细信息。

相关内容