У меня есть следующий код Perl и хотелось бы, чтобы он отображался точно так же, как вызывается вывод /bin/ls
в терминале. Например, на терминале размером до 100 столбцов он должен печатать до 100 символов для вывода перед вставкой новой строки. Вместо этого этот код печатает 1 файл на строку вывода. Я чувствую, что это связано с назначением некоторых параметров терминала для экземпляра IO::Pty
, но я пробовал варианты этого без везения.Как влиять на ширину вывода Perl IPC :: Open3?
UPDATE: я заменил <$READER>
с вызовом sysread
в надежде, что исходный код может просто иметь проблему буферизации, но вывод, полученный от sysread
еще один файл в каждой строке.
UPDATE: Я добавил код, показывающий мою попытку изменить размер IO :: Pty с помощью метода clone_winsize_from
. Это не привело к тому, что выход был другим.
UPDATE: Как я могу судить (от чтения IPC :: open3 код для версии 1.12), кажется, вы не можете передать переменную типа IO :: Handle без open3
создания канала, а не dup
«ИНГ дескриптор файла , Это означает, что isatty
не возвращает истинное значение, когда ls
вызывает его, а ls
затем приводит себя в режим «один файл в строке».
Я думаю, что мне просто нужно сделать fork/exec и обработать перенаправление ввода-вывода.
#!/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();
Спасибо. Я пытался сделать это несколько раз с «local $ READER», который не работал. – nall
'$ READER' является скалярным. Вам нужен глобус. Ключ к использованию '> & READER' не является' local', это использование glob. – ikegami