Взять stdin из файла, но при этом оставить его в терминале

Взять stdin из файла, но при этом оставить его в терминале

У меня есть программа, которая требует от меня ввода данных по мере выполнения программы. Представьте себе это примерно так:

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

Теперь у меня есть несколько тестовых входов для запуска моей программы. Все они содержат что-то вроде:

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

Однако некоторые из моих тестовых скриптов не работают, и, к сожалению, мне очень сложно определить, где именно произошел сбой, поскольку мой терминал выглядит следующим образом:

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

Есть ли способ, позволяющий мне по-прежнему вводить данные stdinчерез файл, но при этом терминал будет выглядеть так, как будто я все ввел?

Если это имеет значение, то моя ОС — Linux Mint 16.

решение1

Вместо использования перенаправления ввода (./program < arthur.txt), которое просто буферизует ввод для вашей программы, вам следует использовать такие инструменты, как «expect», чтобы ждать вопроса и отправлять ответы один за другим.

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

Лучшие примеры:http://www.pantz.org/software/expect/expect_examples_and_tips.html

решение2

Именно teeдля этого он и используется.

Например:

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

Что здесь происходит, так это то, что tee берет stdin и копирует его в stdout и снова выводит. Так же, как at joint для pipe.

Более подробную информацию можно найти на странице руководства tee(1).

Связанный контент