如何影响Perl IPC::Open3输出的宽度?

如何影响Perl IPC::Open3输出的宽度?,perl,terminal,ipcopen3,Perl,Terminal,Ipcopen3,我有下面的Perl代码,希望它显示得与终端中调用/bin/ls时显示的完全一样。例如,在大小为100列的终端上,在插入换行符之前,它将打印最多100个字符的输出。相反,这段代码每输出一行打印一个文件。我觉得这涉及到为IO::Pty实例分配一些终端设置,但我尝试了不同的设置,但运气不好 更新:我用调用sysread替换了,希望原始代码可能存在缓冲问题,但从sysread接收的输出仍然是每行一个文件 更新:我添加了代码,显示我试图通过clone\u winsize\u from方法更改IO::Pty

我有下面的Perl代码,希望它显示得与终端中调用
/bin/ls
时显示的完全一样。例如,在大小为100列的终端上,在插入换行符之前,它将打印最多100个字符的输出。相反,这段代码每输出一行打印一个文件。我觉得这涉及到为
IO::Pty
实例分配一些终端设置,但我尝试了不同的设置,但运气不好

更新:我用调用
sysread
替换了
,希望原始代码可能存在缓冲问题,但从
sysread
接收的输出仍然是每行一个文件

更新:我添加了代码,显示我试图通过
clone\u winsize\u from
方法更改IO::Pty的大小。这并没有导致输出有任何不同

更新:从阅读IPC::open3 1.12版代码可以看出,如果不
open3
创建管道,而不是
dup
,似乎无法传递IO::Handle类型的变量。这意味着当
ls
调用它时,
isatty
不会返回真值,
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();
#/usr/bin/env perl
使用IPC::Open3;
使用IO::Pty;
严格使用;
my$READER=IO::Pty->new();
$READER->slave->clone\u winsize\u from(\*STDIN);
my$pid=open3(未定义,$READER,未定义,“/bin/ls”);
while(我的$line=)
{
打印$行;
}
waitpid($pid,0)或die“等待pid时出错:$!\n”;
$READER->close();
描述从(\*FH)克隆winsize的
方法。您可以尝试克隆实际pty的维度


我看到您仅将
pty
设置为子进程的
stdout
。您可能还需要将其设置为其
stdin
——当子进程向其
stdout
发送“query terminal size”转义序列时,它需要在其
stdin

上接收响应。您可以将
-C
选项传递到
ls
,以强制它使用列式输出(没有涉及到
IO::Pty

我认为
$READER
正在被
open3
创建的管道覆盖,这可以通过更改

my $READER = ...;
my $pid = open3(undef, $READER, undef, "/bin/ls");


请参阅。

谢谢。我看到了并尝试过。更新了问题中的代码以反映尝试。请注意,在避开open3 for fork/exec时,仍然需要调用。更新了答案并提供了另一个建议。谢谢,但/bin/ls只是一个简单的示例。我需要一个通用解决方案。谢谢。我曾多次尝试使用“local$READER”不起作用。
$READER
是标量。您需要一个glob。使用
&READER
的关键不是
local
,而是使用glob。
local *READER = ...;
my $pid = open3(undef, '>&READER', undef, "/bin/ls");