У меня есть программа, которая требует от меня ввода данных во время работы программы. Представь себе что-то вроде этого:
$ ./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 - это моя ОС, если это имеет значение.
Ответы:
Вместо использования перенаправления ввода (./program <arthur.txt), которое просто буферизует ввод в вашу программу, вы должны использовать инструменты так же, как «ожидайте», чтобы дождаться вопроса и отправлять ответы по одному.
Лучшие примеры: http://www.pantz.org/software/expect/expect_examples_and_tips.html
источник
expect
скрипт, который знает, что вызывает вашу программу, и знает, чтобы передать вашей программе третью строку ввода в ответ на вопрос «Какой ваш любимый цвет?» вопрос - а затем попроситеexpect
сценарий прочитатьarthur.txt
файл (или любой другой указанный, надлежащим образом структурированный файл), чтобы получить эти входные данные, а не жестко запрограммировать их в сценарии.Это именно то, что
tee
используется для.Например:
То, что происходит здесь, - это то, что тройник берет stdin и копирует его в stdout и снова выводит его. Прямо как на стыке труб.
Проверьте man-tee (1) для более подробной информации.
источник
program.exe
иarthur.txt
.cat arthur.txt | tee >( program.exe )