Візьміть stdin з файлу, але все-таки покажіть його в терміналі


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 - це моя ОС, якщо це має значення.


Я не знаю, як це зробити, але ви "повинні" мати можливість це робити, використовуючи (небуферовані) пристрої. Дивіться stackoverflow.com/questions/8514735/… для деяких доказів.
Джо

Відповіді:


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


Після того, як ви працюєте над цим вище, ви зможете перетворити його на expectсценарій, який знає, що підкаже ваші проблеми з програмою, і вміє подавати програмі третій рядок введення у відповідь на "Який ваш улюблений колір?" питання - а потім попросіть expectскрипт прочитати arthur.txtфайл (або будь-який інший вказаний, відповідним чином структурований файл), щоб отримати ці входи, а не їх жорстко закодовано в сценарії.
G-Man каже: "Відновіть Моніку"

7

Це саме те tee, для чого використовується.

Наприклад:

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

Що трапляється тут, трійник приймає stdin і копіює його в stdout і передає його знову. Так само, як при стику для труб.

Перегляньте трійник (1) для отримання більш детальної інформації.


1
Чи гарантовано повідомлення відображаються у правильному порядку? Навіть ігноруючи буферизацію, це по суті дві програми, що працюють одночасно і намагаються записати на один і той же екран.
Федеріко Полоні

1
Як це використовується в моєму сценарії? Я спробував прочитати вручну, але, здається, в цьому інструменті є набагато більше, ніж просто в моїй скриньці, і я не зовсім зрозумів, як би ним користуватися, коли мова йде про program.exeта arthur.txt.
Замбезі

@Zambezicat arthur.txt | tee >( program.exe )
gronostaj

2
Трій був першим, що мені теж прийшло в голову. Але я спробував це і підтвердив, що це не працює. Вихід відображається окремо. У моєму експерименті спочатку з’являється вміст arthur.txt, а потім запитання від program.exe. Можливо, ви зможете змусити його працювати з "розвантажувачем" очікувань, але мені не пощастило.
якийсь користувач
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.