私は Perl の初心者で、Curses (Curses::UI) を使用して Perl で簡単なスクリプトのランチャーを実行しようとしています。
Stackoverflow で、Bash スクリプトの出力をリアルタイムで (Perl で) 印刷するソリューションを見つけました。
しかし、私の Curses スクリプトでは、この出力を TextEditor フィールドに書き込むことはできません。
たとえば、Perl スクリプトは次のようになります。
#!/usr/bin/perl -w
use strict;
use Curses::UI;
use Curses::Widgets;
use IO::Select;
my $cui = new Curses::UI( -color_support => 1 );
[...]
my $process_tracking = $container_middle_right->add(
"text", "TextEditor",
-readonly => 1,
-text => "",
);
sub launch_and_read()
{
my $s = IO::Select->new();
open my $fh, '-|', './test.sh';
$s->add($fh);
while (my @readers = $s->can_read()) {
for my $fh (@readers) {
if (eof $fh) {
$s->remove($fh);
next;
}
my $l = <$fh>;
$process_tracking->text( $l );
my $actual_text = $process_tracking->text() . "\n";
my $new_text = $actual_text . $l;
$process_tracking->text( $new_text );
$process_tracking->cursor_to_end();
}
}
}
[...]
$cui->mainloop();
このスクリプトには、launch_and_read() を起動するボタンが含まれています。
そして test.sh :
#!/bin/bash
for i in $( seq 1 5 )
do
sleep 1
echo "from $$ : $( date )"
done
その結果、bash スクリプトの実行中にアプリケーションがフリーズし、最終的な出力が最後に TextEditor フィールドに書き込まれます。
Perl スクリプトをブロックせずに、シェル スクリプトで何が起こったかをリアルタイムで表示するソリューションはありますか?
この質問がばかげているように思われる場合は申し訳ありません:x