如何影响Perl IPC::Open3输出的宽度?
我有下面的Perl代码,希望它显示得与终端中调用如何影响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
/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");