我有以下 Perl 代码,并希望它完全按照/bin/ls
在终端中调用的方式显示。例如,在一个大小为 100 列的终端上,它会在插入换行符之前打印多达 100 个字符的输出。相反,此代码每行输出打印 1 个文件。我觉得这涉及为IO::Pty
实例分配一些终端设置,但我已经尝试过这种变体,但没有运气。
更新:我<$READER>
用一个调用替换了,sysread
希望原始代码可能只是有缓冲问题,但从接收的输出sysread
仍然是每行一个文件。
更新:我添加了显示我尝试通过该clone_winsize_from
方法更改 IO::Pty 大小的代码。这并没有导致输出有任何不同。
更新:据我所知(通过阅读 1.12 版的 IPC::open3 代码),您似乎无法在不open3
创建管道而不是dup
文件句柄的情况下传递 IO::Handle 类型的变量。这意味着在调用它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();