1

Expect を使用して、長時間実行される対話型プロセスと通信しようとしています。プロセスをシミュレートするために cat -un を使用しています。私のコードは次のとおりです。

    #!/usr/bin/perl 

    use strict; 
    use warnings; 
    use Expect; 

    my $timeout = 4000; 

    my $exp = Expect->spawn("cat -un"); 

    my $text = <STDIN>; 
    $exp->send($text); 

    $text = <STDIN>; 
    $exp->send($text); 

    $exp->expect(undef); # Forever until EOF 
    $exp->expect($timeout); # For a few seconds 
    $exp->expect(0); 

    $text = <STDIN>; 
    $exp->send($text); 

    $exp->expect(undef); # Forever until EOF 
    $exp->expect($timeout); # For a few seconds 
    $exp->expect(0); 

最初の文字列 + enter を押しても何も出力されません (明らかに)。2 番目の文字列を入力し、Enter キーを押して、cat -un から stdout を画面にダンプします。私の 3 番目の文字列は出力を生成しませんが、stdout も画面にダンプしたいと考えています。

私の目標は、画面にテキストを表示する (ユーザーにメニューから選択するように求める) インタラクティブなプロセスと通信し、ユーザーに応答を入力してプロセスに送信する (より多くの出力とメニューを生成する) ことです。

これを行うには、Expect が最も簡単な方法のようです。助けてください。

4

1 に答える 1

0

私はあなたがやろうとしていることを完全に理解していませんが、生成"cat -un"してから を介して入力を待つこの例を思いつきました<STDIN>。入力を受け取るたびに、その入力を に送信し、"cat -n"戻ってきて次の入力を待ちます。

#!/usr/bin/perl 

use strict; 
use warnings; 
use Expect; 

my $timeout = 5; 

my $exp = Expect->spawn("cat -un"); 

#$exp->debug(3);
$exp->debug(0);

my $text;
my $idx = 1;
while (1) {
    $text = <STDIN>; 
    $exp->send($text); 
    $exp->expect(1);

    print "$idx. sent text -> $text";
    $idx++;
}

この sript を実行すると、次の出力が生成されます。

% ./myexpect.pl 
s1                          <---- my input
s1
     1  s1
1. sent text -> s1
s2                          <---- my input
s2
     2  s2
2. sent text -> s2
s3                          <---- my input
s3
     3  s3
3. sent text -> s3
s4                          <---- my input
s4
     4  s4
4. sent text -> s4
Ctrl-C                      <---- my input
%

コメントまたは質問に詳細情報を提供していただければ、質問にさらに対処することができます。

于 2012-12-30T04:42:29.430 に答える