
プログラムの実行中にデータを入力する必要があるプログラムがあります。次のようなものを想像してください。
$ ./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 が私の OS です。
答え1
プログラムへの入力をバッファリングするだけの入力リダイレクト (./program < arthur.txt) を使用する代わりに、質問を待機して回答を 1 つずつ送信する "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 にコピーし、再度パイプ出力することです。パイプのジョイントと同様です。
詳細については、manページtee(1)を参照してください。