/bin/ls
私は次のPerlコードを持っており、ターミナルでの呼び出しが表示するのとまったく同じように表示したいと思います。たとえば、100列のサイズの端末では、改行を挿入する前に最大100文字相当の出力が出力されます。代わりに、このコードは出力行ごとに1つのファイルを出力します。インスタンスにいくつかの端末設定を割り当てる必要があるように感じますが、IO::Pty
運が悪かったので、そのバリエーションを試しました。
更新:元のコードにバッファリングの問題がある可能性があることを期待<$READER>
する呼び出しに置き換えましたが、から受信した出力は1行に1ファイルのままです。sysread
sysread
更新:clone_winsize_from
メソッドを介してIO::Ptyのサイズを変更しようとしたことを示すコードを追加しました。これにより、出力に違いは生じませんでした。
更新:(バージョン1.12のIPC::open3コードを読んで)私が知る限り、ファイルハンドルをopen3
作成するのではなく、パイプを作成せずにタイプIO::Handleの変数を渡すことはできないようですdup
。これは、呼び出したisatty
ときに真の値を返さず、強制的に「1行に1つのファイル」モードになることを意味します。ls
ls
フォーク/実行を実行し、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();