
У меня есть программа, которая требует от меня ввода данных по мере выполнения программы. Представьте себе это примерно так:
$ ./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).