Retira stdin do arquivo, mas ainda assim ele aparece no terminal

9

Eu tenho um programa que requer 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, assim como o meu terminal:

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

Existe uma maneira que eu ainda posso dar entrada para stdin através de um arquivo, mas ainda assim o terminal aparece como se eu tivesse digitado tudo?

O Linux Mint 16 é o meu SO, se isso importa.

    
por Zambezi 07.06.2015 / 06:05

2 respostas

13

Em vez de usar o redirecionamento de entrada (./program < arthur.txt), que é apenas uma entrada de buffer para o seu programa, você deve usar ferramentas exatamente como "esperar" para aguardar a pergunta e enviar as respostas uma a 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: link

    
por 07.06.2015 / 07:57
7

É exatamente para isso que o tee é usado.

Por exemplo:

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

O que acontece aqui é tee stdin e copia para stdout e canaliza-lo novamente. Assim como uma junta t para canos.

Verifique o tee manpage (1) para mais detalhes.

    
por 07.06.2015 / 09:33