ファイルから標準入力を取得しますが、それでもターミナルに表示されます


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が私のOSです。


これを行う方法はわかりませんが、(バッファリングされていない)ttyデバイスを使用してこれを実行できるはずです。手がかりについては、stackoverflow.com / questions / 8514735 /…を参照してください。
Joe

回答:


13

プログラムへの入力をバッファリングするだけの入力リダイレクト(./program <arthur.txt)を使用する代わりに、「期待」と同じようにツールを使用して、質問を待ち、回答を1つずつ送信する必要があります。

#!/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スクリプトに進化させて、プログラムの問題を引き起こす原因を認識し、「好きな色は何ですか?」に応じて3番目の入力行をプログラムに与えることができるようにします。質問—そして、expectスクリプトにarthur.txtファイル(または他の指定された、適切に構造化されたファイル)を読み取って、スクリプトにハードコーディングするのではなく、それらの入力を取得します。
G-Manは 'Reinstate Monica'を2015

7

これはまさにtee使用されるものです。

例えば:

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

ここで何が起こるかとは、teeがstdinを取得してstdoutにコピーし、それを再びパイプすることです。パイプのジョイントと同じです。

詳細については、マンページのtee(1)を確認してください。


1
ただし、メッセージは正しい順序で表示されることが保証されていますか?バッファリングを無視しても、これは基本的に同時に実行され、同じ画面に書き込もうとする2つのプログラムです。
フェデリコポローニ2015年

1
私のシナリオではこれをどのように使用しますか?私はmanページを読んでみましたが、ちょうど私のユースケースよりも、このツールには、より多くのがあるようです、と私は非常にそれが来るとき、私はそれを使用したいどのようになっていなかったprogram.exearthur.txt
ザンベジ

@Zambezicat arthur.txt | tee >( program.exe )
gronostaj

2
ティーも最初に思い浮かんだ。しかし、私はそれを試しました、そしてそれが動かないことを確認しました。出力は個別に表示されます。私の実験では、arthur.txtのコンテンツが最初に表示され、次にprogram.exeからの質問が表示されます。あなたはそれを期待の「アンバッファー」で動作させることができるかもしれませんが、私は運がありませんでした。
一部のユーザー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.