Ansi转义序列和重定向:意外行为

时间:2014-07-17 14:46:27

标签: perl redirect stdout stderr ansi-escape

当我运行此脚本时,只要我不将STDOUT重定向到文件,它就可以正常工作。当我将STDOUT重定向到文件时,ENTER:之后的输出会中断。如果我将STDOUT重定向到文件,为什么脚本不再工作?

#!/usr/bin/env perl
use warnings;
use strict;
use Term::ReadKey;
use Unicode::GCString;
use Term::ANSIScreen qw( :all );

select( *STDERR );
$| = 1;


print YELLOW "YELLOW\n";
print RESET;

print "ENTER:";
my $dummy = <>;

print savepos;
my $str = '';
print_readline( $str );
for my $s ( 33 .. 126 ) {
    $str .= '  ' . chr( $s ) x 5;
    print_readline( $str );
}
print "\n";

sub print_readline {
    my ( $str ) = @_;
    my $gcs = Unicode::GCString->new( $str );
    my $up = int( $gcs->columns() / ( GetTerminalSize )[0] );
    print loadpos;
    if ( $up ) {
        print "\n" x $up, up( $up );
    }
    print cldown, savepos, $str;
}

1 个答案:

答案 0 :(得分:1)

TTY的驱动程序可能有代码通过在屏幕上移动光标或更改颜色来响应特定字符序列,但文本文件的默认驱动程序没有此类代码。

如果你想捕捉终端会话的输出,以便你可以在即时重播中观看它,我知道一个命令名script,它将打印到终端的所有内容记录到一个文件,然后您可以使用编辑器读取,或者回到屏幕上观看重播。

您可能需要在捕获输出和使用ANSIScreen模块之间做出决定。