【发布时间】:2012-06-03 19:30:21
【问题描述】:
我有以下 Perl 代码,并希望它完全显示在终端中调用 /bin/ls 会显示。例如,在一个大小为 100 列的终端上,它会在插入换行符之前打印多达 100 个字符的输出。相反,此代码每行输出打印 1 个文件。我觉得这涉及将一些终端设置分配给IO::Pty 实例,但我尝试了一些变体但没有运气。
更新:我将 <$READER> 替换为对 sysread 的调用,希望原始代码可能只是存在缓冲问题,但从 sysread 收到的输出仍然是每行一个文件.
更新:我添加了显示我尝试通过 clone_winsize_from 方法更改 IO::Pty 大小的代码。这并没有导致输出有任何不同。
更新:据我所知(通过阅读 1.12 版的 IPC::open3 代码),如果没有 open3 创建管道,您似乎无法传递 IO::Handle 类型的变量比dup'ing 文件句柄。这意味着isatty 在ls 调用它并且ls 然后强制自己进入“每行一个文件”模式时不会返回真值。
我想我只需要执行一个 fork/exec 并自己处理 I/O 重定向。
#!/usr/bin/env perl
use IPC::Open3;
use IO::Pty;
use strict;
my $READER = IO::Pty->new();
$READER->slave->clone_winsize_from(\*STDIN);
my $pid = open3(undef, $READER, undef, "/bin/ls");
while(my $line = <$READER>)
{
print $line;
}
waitpid($pid, 0) or die "Error waiting for pid: $!\n";
$READER->close();
【问题讨论】: