3

/bin/ls私は次のPerlコードを持っており、ターミナルでの呼び出しが表示するのとまったく同じように表示したいと思います。たとえば、100列のサイズの端末では、改行を挿入する前に最大100文字相当の出力が出力されます。代わりに、このコードは出力行ごとに1つのファイルを出力します。インスタンスにいくつかの端末設定を割り当てる必要があるように感じますが、IO::Pty運が悪かったので、そのバリエーションを試しました。

更新:元のコードにバッファリングの問題がある可能性があることを期待<$READER>する呼び出しに置き換えましたが、から受信した出力は1行に1ファイルのままです。sysreadsysread

更新:clone_winsize_fromメソッドを介してIO::Ptyのサイズを変更しようとしたことを示すコードを追加しました。これにより、出力に違いは生じませんでした。

更新:(バージョン1.12のIPC::open3コードを読んで)私が知る限り、ファイルハンドルをopen3作成するのではなく、パイプを作成せずにタイプIO::Handleの変数を渡すことはできないようですdup。これは、呼び出したisattyときに真の値を返さず、強制的に「1行に1つのファイル」モードになることを意味します。lsls

フォーク/実行を実行し、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();
4

3 に答える 3

2

$READERによって作成されたパイプで上書きされていると思いますがopen3、これを変更することで回避できます

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

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

ドキュメントを参照してください。

于 2012-06-04T06:00:27.370 に答える
1

-Cオプションを渡して、 (関与lsせずに)列出力を使用するように強制できます。IO::Pty

于 2012-06-03T22:09:57.570 に答える
0

IO::Ptyドキュメントclone_winsize_from(\*FH)メソッドについて説明しています。実際のptyの寸法を複製してみてください。

子プロセスのpty時点でのみ設定しているようです。stdoutそれをそのとしても設定する必要があるかもしれませんstdin—子プロセスが「クエリ端末サイズ」エスケープシーケンスをに送信するとき、そのstdoutで応答を受信する必要がありますstdin

于 2012-06-03T21:59:11.470 に答える