9

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

$ ./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 - это моя ОС, если это имеет значение.

2 ответа2

13

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

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

7

Это именно то, для чего используется tee .

Например:

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

То, что происходит здесь, - это то, что тройник берет stdin и копирует его в stdout и снова передает его. Прямо как на стыке труб.

Проверьте man-tee (1) для более подробной информации.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .