2012-06-03 22 views
3

我有下面的Perl代碼,並希望它在終端顯示時完全顯示爲調用/bin/ls。例如,在一個大小爲100列的終端上,在插入換行符之前,它最多可打印100個字符的輸出。相反,該代碼在每行輸出中打印1個文件。我覺得它包括將一些終端設置分配給IO::Pty實例,但我嘗試過這樣的變化,但沒有運氣。如何影響Perl IPC :: Open3輸出的寬度?

更新:我更換了<$READER>通過調用sysread希望原代碼可能只是有一個緩衝的問題,但是從sysread接收到的輸出仍然是每行一個文件。

更新:我添加了代碼,顯示了我通過clone_winsize_from方法更改IO :: Pty大小的嘗試。這並沒有導致產量有任何不同。

UPDATE:作爲最好的,我可以告訴(讀取IPC :: 1.12版本open3代碼),似乎你不能通過類型的變量IO ::處理不open3創建一個管道,而不是dup「荷蘭國際集團的文件句柄。這意味着isattyls調用它時不返回真值,然後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(); 

回答

1

我覺得$READER被覆蓋掉了與open3創建一個管道,它可以通過改變

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

地避免

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

docs

+0

謝謝。我曾嘗試過使用「本地$ READER」這樣做了幾次,但沒有成功。 – nall

+1

'$ READER'是標量。你需要一個glob。使用'>&READER'的關鍵不是'local',而是使用glob。 – ikegami

0

IO::Pty docs描述clone_winsize_from(\*FH)方法。你可以嘗試克隆你的實際pty的尺寸。

我看到你設置pty只有stdout的子進程。您可能需要將其設置爲其stdin - 當子進程將「查詢終端大小」轉義序列發送到其stdout時,它需要接收其stdin上的響應。

+0

謝謝。我看到了,並嘗試過。更新了我的問題中的代碼以反映這一嘗試。 – nall

+0

請注意,在避開fork/exec的open3時,仍然需要調用*。 – nall

+0

用另一個建議更新了答案。 – lanzz

1

您可以將-C選項傳遞給ls以強制它使用列輸出(不涉及IO::Pty)。

+0

謝謝,但/ bin/ls只是一個簡單的例子。我需要一個通用的解決方案。 – nall

相關問題