2016-12-21 9 views
0

bashラインエディタを使用して以前に入力したコマンドを呼び出すスクリプトを作成しようとしています。ここで私が自動化しようとしているシンプルなセッションです。Perl Expect.pmは制御文字をサブプロセスに送ります

$ bash --norc --noprofile 
bash4.4$ echo hi 
hi 
bash4.4$ 

は、 '^ P^M' と入力

bash4.4$ echo hi 
hi 

ここでは、このCPANオフExpect.pmモジュールを使用して、スクリプトでの私の最初の試みです。 2つのsleep 1は、ラインエディタを呼び出すときに競合の可能性を避けるためにそこにあります。なぜなら、それがいつ発生するのか、私は確信しています。私は(私も"\cP\cM"を試してみた)"\cp\cm"を打つまで

#!/usr/bin/env perl 
use strict; 
use warnings FATAL => 'all'; 
use autodie; 
use Expect; 

my $timeout = 10; 

my $exp = Expect->new(); 

$exp->spawn('bash --norc --noprofile'); 

# wait for first prompt 
$exp->expect($timeout, '$ '); 
# send echo hi 
$exp->send("echo hi\n"); 
# wait for prompt again 
$exp->expect($timeout, '$ '); 
# use history recall ^P, then send ^M 
sleep 1; 
$exp->send("\cp\cm"); 
sleep 1; 
print "okay done!\n"; 

それは、最大動作します。 perlのドキュメントによると、\cXはASCII制御文字を導入しています。 (http://perldoc.perl.org/perlrebackslash.html#Character-Escapes

制御文字\ cは、制御文字を示すために使用されます。 \ cの後ろにある 文字が構文の値を決定します。 の場合、\ cAの値はchr(1)で、\ cbの値はchr(2)、 などです。詳細についてはperlopのRegexp Quote-Like Operatorsを参照してください。 A ASCIIおよびEBCDIC プラットフォームのchr(1)などの意味の完全なリストは、perlebcdicのオペレータの違いにあります。

これは、制御文字がサブプロセスに正しく渡されず、まったく渡されないことを強く示唆するスクリプトを実行するときに実際に取得するものです。

% perl bash.pl 
bash-4.4$ echo hi 
hi 
bash-4.4$ okay done! 

ここでは何が起こっていますか? Expect.pmのプロセスに制御文字を渡すにはどうすればよいですか?

答えて

1

検索しているエスケープ文字は、Perl正規表現に固有のものです。あなたの目的のために、ctrl-Mctrl-Phex valueを渡すことをお勧めします。

$exp->send("\x10"); # ctrl+P 

$exp->send("\x0D"); # ctrl+M 

アップデート(テスト):

$exp->send("\x10"); # ctrl+P 
$exp->send("\n"); # send newline 
sleep 2; 

# wait for prompt 
$exp->expect($timeout, '$ '); 

$exp->send("\x0D"); # ctrl+M 
$exp->send("\n"); # send newline 
+0

ああ。もちろん。私は問題のセクションを 'sleep 1;に置き換えようとしました。 $ exp-> send( "\ x10");睡眠1; $ exp-> send( "\ x0D");スリープ1; 'が表示されますが、行エディタを起動するようには見えません。 –

+0

改行の後にも改行を送る必要があります。私は重要な部分を実演しました。アップデートをチェックする。 –

+0

あなたはそれを実行したとき何を見たのですか?私は '$ exp-> send(" \ cm \ cp ");をあなたが示唆したものに置き換えようとしましたが、' hi'を2回エコーする 'bash'を得ることはできません。 ...あなたが実際に間にプロンプ​​トを期待しなければならないことに気をつけてください... –

関連する問題