
我有一個程序,要求我在程序運行時輸入資料。想像這樣:
$ ./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),它只是緩衝程式的輸入,而應該使用「期望」一樣的工具來等待問題並一一發送答案。
#!/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)。