Использование Expect с Perl и конвейером в файл - PullRequest
3 голосов
/ 01 июля 2011

Я довольно новичок в Perl и искал в интернете документацию о том, что я пытаюсь сделать.Мне не повезло.

У меня есть программа, которая выводит информацию на стандартный вывод с подсказками.Мне нужно сделать Perl-скрипт для передачи этой информации в файл.

Я думал, что смогу использовать Expect, но, похоже, проблема с каналом после первого запроса.

Вотчасть моего кода:

# Run program and compare the output to the BASE file
$cmd = "./program arg1 arg2 arg3 arg4 > $outfile";

my $exp = new Expect;
$exp->spawn($cmd);
BAIL_OUT("couldn't create expect object") if (! defined $exp);

$exp->expect(2);
$exp->send("\n");

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

Выходной файл содержит только первую половину информации.

Есть ли у кого-нибудь предложения покак я могу получить вторую половину?

ОБНОВЛЕНИЕ: я проверил, что это работает с Expect, используя простой скрипт:

spawn ./program arg1 arg2 arg3 arg4
expect "<Return>"
send "\r"
interact

Где "" - этоподробное выражение, которое может найти скрипт Perl.

Примечание: я пытался написать свой скрипт Perl, ожидая "" ... это не имеет значения.

т.е.

$exp->expect(2, '-re', "<Return>")

Есть мысли?

ОБНОВЛЕНИЕ2:

Хаза!Я нашел решение своей проблемы ... совершенно случайно.

Итак, в каком-то тестовом коде я допустил опечатку ...

$exp->expect(2);
$exp->send("\r");
$exp->expect(2);

Обратите внимание на ожидаемый трейлинг(2) ... я случайно оставил это, и это сработало!

Итак, я пытаюсь понять, что происходит.Unix ожидать, похоже, не работает таким образом!Похоже, что Expect, реализованный в Perl, "ожидает" что-нибудь ... не только приглашения?

Итак, я ожидал еще 2 секунды, чтобы собрать стандартный вывод, и я могу получить все.могу предложить более подробную информацию о том, что здесь происходит, я бы хотел понять, что происходит.

Ответы [ 2 ]

4 голосов
/ 19 июля 2011

Попробуйте отправить \r вместо \n - вы пытаетесь эмулировать возврат каретки, а не перевод строки, и настройки tty могут не переводить их.

ТАКЖЕ:

Предложение из раздела часто задаваемых вопросов Expect docs, которое, вероятно, с учетом вашего случайного решения:

Мой сценарий время от времени завершается сбоем без какой-либо очевидной причины.Кажется, что иногда я теряю вывод из порожденной программы.

Возможно, вы выходите слишком быстро, не давая порожденной программе достаточно времени для завершения.Попробуйте добавить $ exp-> soft_close (), чтобы корректно завершить программу, или ожидайте () для 'eof'.

В качестве альтернативы, попробуйте добавить 'sleep 1' после того, как вы вызвали () программу.Может случиться так, что создание pty в вашей системе будет медленным (но это довольно маловероятно, если вы используете последнюю версию IO-Tty).

Стандартное ожидание unix / tcl не завершается в интерактивном режиме, что может дать вашей программе достаточно времени для завершения работы.

1 голос
/ 01 июля 2011

Прошло много времени с тех пор, как я использовал Expect, но я уверен, что вам нужно предоставить что-то, чтобы Expect соответствовал подсказке:

$exp->expect( 2, 'Press enter' );

, например.

...