![从文件中获取标准输入但仍让它显示在终端中](https://linux22.com/image/1453209/%E4%BB%8E%E6%96%87%E4%BB%B6%E4%B8%AD%E8%8E%B7%E5%8F%96%E6%A0%87%E5%87%86%E8%BE%93%E5%85%A5%E4%BD%86%E4%BB%8D%E8%AE%A9%E5%AE%83%E6%98%BE%E7%A4%BA%E5%9C%A8%E7%BB%88%E7%AB%AF%E4%B8%AD.png)
我有一个程序,要求我在程序运行时输入数据。想象一下这样的情况:
$ ./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) 以了解更多详细信息。