Как повторить перенаправленный stdin

Я выполняю приложение из файла сценария и перенаправляю stdin к нему из здесь-документа как это:

my_cli << HERE_DOC
enable
configure
10
exit
exit
HERE_DOC

Это работает как ожидалось, но я не вижу ни входа, ни вывода приложения. Приложение является интерактивным немедленным письменным в C. Когда я взаимодействую вручную с ним, я вижу саму подсказку и ответы на мой вход, но когда я выполняю вышеупомянутый сценарий, я ничего не вижу. Я хотел бы, чтобы это распечатало вход и вывод, как будто реальный пользователь вводил. Вы знаете, как достигнуть этого?

2
задан 27.09.2010, 10:37

3 ответа

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

wrapper () { local text=$(</dev/stdin); echo "$text"; my_cli <<<"$text"; }
wrapper << HERE_DOC
enable
configure
10
exit
exit
HERE_DOC

Обработать здесь документ линию за линией:

wrapper2 () { local line; while read -r line; do echo "$line"; my_cli <<<"$line"; done; }

Если Вы вручную взаимодействуете со своей программой, она показывает вывод? Это производит к stdout или stderr?

Другая опция, которая могла бы работать на Вас, expect.

3
ответ дан 08.12.2019, 05:53

Я вижу Perl!

Ну, Вы не можете сделать этого при использовании qx или системных вызовов так как они блокируются по своей природе (да, можно сделать систему ("программа и") или назвать ее от другого потока и отсоединить ее.

Поток средства запуска:

threads->create( sub { 
                    threads->self->detach(); 
                    qx"$cmd > file1.cmd";
});

Основной код::

threads->create( sub {
while (1) { 
 get file size, if it is bigger than second ago - read new line, increase size
 parse new line, if any?
 sleep 1;
}
} );

Лучше, use POE::Wheel::FollowTail

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

man mkfifo
1
ответ дан 08.12.2019, 05:53
(tee /dev/fd/42 | mycmd) 42>&1 <<EOF
blah
blah
EOF

Это не будет точно походить на реального пользователя - весь вход будет сразу распечатан. expect вероятно, лучше для этого.

1
ответ дан 08.12.2019, 05:53

Теги

Похожие вопросы