2

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

my_cli << HERE_DOC
enable
configure
10
exit
exit
HERE_DOC

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

3 ответа3

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; }

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

Другой вариант, который может работать для вас, это expect.

1

Я вижу Perl!

Ну, вы не можете сделать это, если используете qx или системные вызовы, поскольку они по своей природе блокируют (да, вы можете сделать system («program &») или вызвать ее из другого потока и отсоединить ее.

Пусковая тема:

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
(tee /dev/fd/42 | mycmd) 42>&1 <<EOF
blah
blah
EOF

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

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