Pegue o stdin do arquivo, mas ainda apareça no terminal

Pegue o stdin do arquivo, mas ainda apareça no terminal

Eu tenho um programa que exige que eu insira dados enquanto o programa é executado. Imagine algo assim:

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

Agora, tenho várias entradas de teste para executar meu programa. Todos eles contêm algo como:

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

No entanto, alguns dos meus scripts de teste falham e, infelizmente, é muito difícil decifrar exatamente onde eles falharam, pois meu terminal se parece com isto:

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

Existe uma maneira de ainda poder fornecer informações stdinpor meio de um arquivo, mas ainda fazer com que o terminal apareça como se eu tivesse digitado tudo?

Linux Mint 16 é meu sistema operacional, se isso importa.

Responder1

Em vez de usar o redirecionamento de entrada (./program < arthur.txt), que apenas armazena em buffer a entrada do seu programa, você deve usar ferramentas como "esperar" para aguardar a pergunta e enviar as respostas uma por uma.

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

Melhores exemplos:http://www.pantz.org/software/expect/expect_examples_and_tips.html

Responder2

É exatamente teepara isso que é usado.

Por exemplo:

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

O que acontece aqui é que tee pega stdin e copia para stdout e envia novamente. Assim como na junta de tubos.

Verifique a página de manual tee(1) para mais detalhes.

informação relacionada