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のプロセスに制御文字を渡すにはどうすればよいですか?
ああ。もちろん。私は問題のセクションを 'sleep 1;に置き換えようとしました。 $ exp-> send( "\ x10");睡眠1; $ exp-> send( "\ x0D");スリープ1; 'が表示されますが、行エディタを起動するようには見えません。 –
改行の後にも改行を送る必要があります。私は重要な部分を実演しました。アップデートをチェックする。 –
あなたはそれを実行したとき何を見たのですか?私は '$ exp-> send(" \ cm \ cp ");をあなたが示唆したものに置き換えようとしましたが、' hi'を2回エコーする 'bash'を得ることはできません。 ...あなたが実際に間にプロンプトを期待しなければならないことに気をつけてください... –