Prendi lo stdin dal file ma lo mostra ancora nel terminale


9

Ho un programma che mi richiede di inserire i dati durante l'esecuzione del programma. Immagina qualcosa del genere:

$ ./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
...

Ora, ho un certo numero di input di test su cui eseguire il mio programma. Tutti contengono qualcosa del tipo:

Arthur, King of the Britons
To seek the Holy Grail
...

Tuttavia, alcuni dei miei script di test falliscono, e sfortunatamente è molto difficile per me decifrare esattamente dove hanno fallito, dato che il mio terminale sembra così:

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

C'è un modo in cui posso ancora dare input stdintramite un file, ma il terminale appare ancora come se avessi digitato tutto?

Linux Mint 16 è il mio sistema operativo, se questo è importante.


Non so come farlo, ma "dovresti" essere in grado di farlo utilizzando i dispositivi tty (senza buffer). Vedi stackoverflow.com/questions/8514735/… per alcuni indizi.
Joe,

Risposte:


13

Invece di usare il reindirizzamento dell'input (./program <arthur.txt), che è solo buffering dell'input al tuo programma, dovresti usare gli strumenti come "aspettarti" di attendere la domanda e inviare le risposte una per una.

#!/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"

Esempi migliori: http://www.pantz.org/software/expect/expect_examples_and_tips.html


Una volta che hai fatto funzionare quanto sopra, potresti trasformarlo in uno expectscript che sa cosa suggerisce i problemi del tuo programma e sa alimentare il tuo programma la terza riga di input in risposta a "Qual è il tuo colore preferito?" domanda - e quindi fare in modo che lo expectscript legga il arthur.txtfile (o qualsiasi altro file specificato, strutturato in modo appropriato) per ottenere tali input, anziché averli codificati nello script.
G-Man dice "Ripristina Monica" il

7

Questo è esattamente ciò per cui teeviene utilizzato.

Per esempio:

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

Quello che succede qui è che tee prende stdin e lo copia su stdout e lo convoglia nuovamente. Proprio come al giunto per tubi.

Controllare la manpage tee (1) per maggiori dettagli.


1
I messaggi sono garantiti per apparire nell'ordine corretto, però? Anche ignorando il buffering, si tratta essenzialmente di due programmi in esecuzione contemporaneamente e che cercano di scrivere sulla stessa schermata.
Federico Poloni,

1
Come si usa questo nel mio scenario però? Ho provato a leggere le manpage, ma sembra che ci sia molto di più in questo strumento oltre al mio caso d'uso, e non riuscivo a capire come usarlo quando si tratta di program.exee arthur.txt.
Zambezi,

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

2
Tee è stata la prima cosa che mi è venuta in mente. Ma l'ho provato e confermato che non funziona. L'output viene visualizzato separatamente. Nel mio esperimento, il contenuto di arthur.txt viene visualizzato per primo, seguito dalle domande da program.exe. Potresti riuscire a farlo funzionare con "unbuffer" di aspettarti, ma non ho avuto fortuna.
alcuni utenti l'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.