
Ich habe ein Programm, bei dem ich während der Ausführung Daten eingeben muss. Stellen Sie es sich etwa so vor:
$ ./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
...
Jetzt habe ich eine Reihe von Testeingaben, mit denen ich mein Programm ausführen kann. Sie enthalten alle etwas wie:
Arthur, King of the Britons
To seek the Holy Grail
...
Allerdings schlagen einige meiner Testskripte fehl und es ist für mich leider sehr schwierig herauszufinden, wo genau sie fehlgeschlagen sind, da mein Terminal folgendermaßen aussieht:
$ ./program < arthur.txt
Hi there. What's your name?What is your quest?What is your favourite color?...
Gibt es eine Möglichkeit, dass ich weiterhin Eingaben stdin
über eine Datei vornehmen kann, es im Terminal aber trotzdem so aussieht, als hätte ich alles eingegeben?
Falls das wichtig ist, ist Linux Mint 16 mein Betriebssystem.
Antwort1
Anstatt eine Eingabeumleitung (./program < arthur.txt) zu verwenden, bei der die Eingaben für Ihr Programm lediglich gepuffert werden, sollten Sie Tools wie „expect“ verwenden, um auf die Frage zu warten und die Antworten einzeln zu senden.
#!/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"
Bessere Beispiele:http://www.pantz.org/software/expect/expect_examples_and_tips.html
Antwort2
Genau tee
dafür wird es verwendet.
Zum Beispiel:
$ echo foo | tee >( grep bar )
foo
$
Was hier passiert, ist, dass tee die Standardeingabe nimmt, sie nach Standardausgabe kopiert und wieder ausgibt. Genau wie bei Joint für Pipes.
Weitere Einzelheiten finden Sie auf der Manpage tee(1).