gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 01:14:43 28 4
gpt4 key购买 nike

我有以下 Perl 代码并希望它显示与调用 /bin/ls 时完全一样在终端会显示。例如,在大小为 100 列的终端上,它会在插入换行符之前打印多达 100 个字符的输出。相反,此代码每行输出打印 1 个文件。我觉得这涉及将一些终端设置分配给 IO::Pty例如,但我试过它的变体,但没有成功。

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

更新:我添加了代码,显示我尝试通过 clone_winsize_from 更改 IO::Pty 的大小。方法。这不会导致输出有任何不同。

更新:据我所知(从阅读 IPC::open3 版本 1.12 的代码)看来你不能在没有 open3 的情况下传递 IO::Handle 类型的变量。创建管道而不是 dup '正在处理文件句柄。这意味着 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();

最佳答案

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

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

local *READER = ...;
my $pid = open3(undef, '>&READER', undef, "/bin/ls");

参见 docs .

关于perl - 我如何影响 Perl IPC::Open3 输出的宽度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10873290/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com