2010-05-25 38 views
10

Tôi đang tìm một ví dụ về chuyển hướng stdout sang một tệp bằng Perl. Tôi đang làm một công cụ fork/exec khá đơn giản, và tôi muốn chuyển hướng đầu ra của đứa trẻ sang một tệp thay vì tệp phụ huynh.Làm cách nào để chuyển hướng đầu ra tiêu chuẩn sang một tệp trong Perl?

Có sự tương đương với dup2() Tôi nên sử dụng không? Tôi dường như không thể tìm thấy nó

+1

Từ bên trong Perl hoặc từ dòng lệnh? những gì hệ điều hành? – lexu

+1

xem tại đây: http://stackoverflow.com/questions/655719/how-do-i-unalias-from-perls-stdout – lexu

+0

Nếu đó là trường hợp bạn chỉ muốn chuyển hướng đầu ra của chương trình là 'exec 'ed và không có gì quá trình con làm cho đến thời điểm này, sau đó câu hỏi này không nhất thiết phải là Perl cụ thể; đó là vấn đề chuyển hướng vỏ hoặc sử dụng bất kỳ cơ sở nào được tích hợp sẵn trong chương trình mà bạn đang chạy để chạy khi bạn gọi nó. ví dụ. 'exec (" program> out.txt ");'. – cikkle

Trả lời

27

Từ perldoc -f mở:

open STDOUT, '>', "foo.out" 

Các tài liệu là bạn của bạn ...

4

Đứa trẻ tự nó có thể làm select $filehandle để xác định rằng tất cả các print của nó các cuộc gọi phải được chuyển đến một tập tin cụ thể.

Điều tốt nhất mà phụ huynh có thể làm là sử dụng system hoặc exec hoặc thứ gì đó sắp xếp để thực hiện chuyển hướng vỏ.

3
open my $fh, '>', $file; 
defined(my $pid = fork) or die "fork: $!"; 
if (!$pid) { 
    open STDOUT, '>&', $fh; 

    # do whatever you want 
    ... 

    exit; 
} 
waitpid $pid, 0; 
print $? == 0 ? "ok\n" : "nok\n"; 
+0

phương pháp rất đẹp, nhưng tiếc là nó không thể trả về bất kỳ văn bản nào so với số vì giới hạn chức năng thoát khỏi hệ thống. – Znik

3

Một thông tin nghiêm túc nhưng không thực tế câu trả lời:

Mặc dù có gần như chắc chắn một cách thanh lịch hơn đi về việc này tùy thuộc vào chi tiết chính xác về những gì bạn đang cố gắng để làm, nếu bạn hoàn toàn phải có dup2() , tương đương Perl của nó có trong mô-đun POSIX. Tuy nhiên, trong trường hợp này, bạn đang xử lý các bộ mô tả tệp thực sự chứ không phải tệp Perl, và tương ứng bạn bị hạn chế sử dụng các hàm được cung cấp khác trong mô-đun POSIX, tất cả đều tương tự với những gì bạn sẽ sử dụng trong C. ở một mức độ nào đó, bạn sẽ viết C trong Perl không phải Perlish.

http://perldoc.perl.org/POSIX.html

4

Như JS Bangs cho biết, một cách dễ dàng để chuyển hướng đầu ra là sử dụng 'chọn' tuyên bố.
Rất cám ơn nhiều người đã gửi stackoverflow và người dùng của họ. Tôi hy vọng điều này là hữu ích

ví dụ:

print "to console\n"; 
open OUTPUT, '>', "foo.txt" or die "Can't create filehandle: $!"; 
select OUTPUT; $| = 1; # make unbuffered 
print "to file\n"; 
print OUTPUT "also to file\n"; 
print STDOUT "to console\n"; 
# close current output file 
close(OUTPUT); 
# reset stdout to be the default file handle 
select STDOUT; 
print "to console"; 
+0

Thật không may này chỉ hoạt động trong nội bộ kịch bản perl. Nó không chuyển hướng đầu ra cho các lệnh được gọi bởi chức năng hệ thống. – Znik

Các vấn đề liên quan