我是 Perl 的新手,并尝试在 Perl 中使用 Curses (Curses::UI) 做一个简单的脚本启动器
在 Stackoverflow 上,我找到了一种实时打印(在 Perl 中)Bash 脚本输出的解决方案。
但是我不能用我的 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 字段中。
有没有一种解决方案可以实时显示 Shell 脚本中发生的事情,而不阻塞 Perl 脚本?
非常感谢,如果这个问题看起来很愚蠢,我很抱歉:x