Übernehmen Sie stdin aus der Datei, lassen Sie es jedoch im Terminal anzeigen

9

Ich habe ein Programm, bei dem ich Daten eingeben muss, während das Programm ausgeführt wird. Stellen Sie sich so etwas 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
...

Einige meiner Testskripte schlagen jedoch fehl, und leider ist es für mich sehr schwierig, genau zu entschlüsseln, wo sie fehlgeschlagen sind, da mein Terminal so aussieht:

$ ./program < arthur.txt
Hi there. What's your name?What is your quest?What is your favourite color?...

Gibt es eine Möglichkeit, an der ich mich noch beteiligen kann? stdin über eine Datei, aber immer noch das Terminal angezeigt, als hätte ich alles eingegeben?

Linux Mint 16 ist mein Betriebssystem, wenn es darauf ankommt.

Zambezi
quelle
Ich weiß nicht, wie das geht, aber Sie "sollten" dazu in der Lage sein, (ungepufferte) tty-Geräte zu verwenden. Sehen stackoverflow.com/questions/8514735/… für einige Hinweise.
Joe

Antworten:

13

Anstatt die Eingabeumleitung (./program & lt; arthur.txt) zu verwenden, die nur die Eingabe in Ihr Programm puffert, sollten Sie Tools verwenden, die genau wie erwartet auf die Frage warten und die Antworten nacheinander 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

some user
quelle
Sobald Sie das oben genannte zum Laufen gebracht haben, können Sie es in ein expect Skript, das weiß, was Ihre Programmprobleme hervorruft, und Ihr Programm mit der dritten Eingabezeile als Antwort auf die Frage "Was ist Ihre Lieblingsfarbe?" frage - und dann hab die expect Skript las die arthur.txt Datei (oder eine andere angegebene, entsprechend strukturierte Datei), um diese Eingaben abzurufen, anstatt sie im Skript fest zu codieren.
G-Man
7

Genau das ist was tee wird verwendet für.

Zum Beispiel:

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

Was hier passiert, ist, dass tee stdin nimmt und auf stdout kopiert und es wieder herauspfeift. Genau wie eine T-Verbindung für Rohre.

Weitere Informationen finden Sie auf der Hilfeseite tee (1).

Dwight Spencer
quelle
1
Werden die Nachrichten jedoch garantiert in der richtigen Reihenfolge angezeigt? Dies sind im Wesentlichen zwei Programme, die gleichzeitig ausgeführt werden und versuchen, auf denselben Bildschirm zu schreiben.
Federico Poloni
1
Wie benutzt man das in meinem Szenario? Ich habe versucht, die Hilfeseiten zu lesen, aber dieses Tool scheint viel mehr zu bieten als nur meine Verwendung program.exe und arthur.txt.
Zambezi
@Sambesi cat arthur.txt | tee >( program.exe )
gronostaj
2
Tee war auch das erste, was mir in den Sinn kam. Aber ich habe es versucht und bestätigt, dass es nicht funktioniert. Die Ausgabe wird separat angezeigt. In meinem Experiment wird zuerst der Inhalt von arthur.txt angezeigt, gefolgt von den Fragen von program.exe. Sie könnten in der Lage sein, es zum Arbeiten mit "Unbuffer" zu bringen, aber ich hatte kein Glück.
some user