
Tengo un programa que requiere que ingrese datos mientras se ejecuta el programa. Imagínelo así:
$ ./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
...
Ahora tengo varias entradas de prueba con las que ejecutar mi programa. Todos contienen algo como:
Arthur, King of the Britons
To seek the Holy Grail
...
Sin embargo, algunos de mis scripts de prueba fallan y desafortunadamente me resulta muy difícil descifrar exactamente dónde fallaron, ya que mi terminal tiene este aspecto:
$ ./program < arthur.txt
Hi there. What's your name?What is your quest?What is your favourite color?...
¿Hay alguna manera de poder seguir ingresando datos stdin
a través de un archivo, pero que el terminal siga apareciendo como si lo hubiera escrito todo?
Linux Mint 16 es mi sistema operativo si eso importa.
Respuesta1
En lugar de usar la redirección de entrada (./program < arthur.txt), que simplemente almacena la entrada en su programa, debe usar herramientas como "esperar" para esperar la pregunta y enviar las respuestas una por 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"
Mejores ejemplos:http://www.pantz.org/software/expect/expect_examples_and_tips.html
Respuesta2
Esto es exactamente tee
para lo que se utiliza.
Por ejemplo:
$ echo foo | tee >( grep bar )
foo
$
Lo que sucede aquí es que tee toma stdin, lo copia en stdout y lo canaliza nuevamente. Como en las juntas de tuberías.
Consulte la página de manual tee(1) para obtener más detalles.