2010-01-26 43 views
5

Có cách nào để chuyển hướng dữ liệu được in bởi io:format() từ vỏ erlang vào một tệp không? Tôi biết rằng tôi có thể mở một tập tin (IoDevice) và ghi dữ liệu trực tiếp vào nó, nhưng nó đòi hỏi phải thay đổi mã và tôi không muốn làm bây giờ.Chuyển hướng đầu ra từ vỏ erlang vào một tệp

Trả lời

8

Chỉ cần chạy với erl -noinput -s module function -s init stop > file.

Đây là một ví dụ. đang

Erlang:

-module(test).  
-compile(export_all). 

function() -> 
    io:fwrite("Hello world!~n"). 

Trong vỏ:

$ erlc test.erl 
$ erl -noinput -s test function -s init stop > test.txt 
$ cat test.txt 
Hello world! 
2

Bạn cũng có thể sử dụng đối số IODevice để io: fwrite/3 và để cho nó có giá trị nguyên tử standard_io khi bạn don không muốn nó hướng đến một số tập tin. Nếu không thì hãy cho nó tập tin.

Xem phần "Đầu vào/đầu ra tiêu chuẩn" trong tài liệu của io module.

11

Khi quá trình gọi io:format() và các chức năng tương tự, quá trình gửi thông điệp yêu cầu io đến quá trình group_leader của nó. Vì vậy, một hack đơn giản là để mở một tập tin, và thiết lập nó như là group_leader của các quá trình sản xuất đầu ra. Đây là một ví dụ về việc chuyển hướng đầu ra của tiến trình shell tới một tệp.

1> {ok, F} = file:open("z", [write]). 
{ok,<0.36.0>} 
2> group_leader(F, self()). 
3> io:format("Where am I going to appear?~n").  
4> 

Điều này sẽ chỉ chuyển hướng quá trình shell hiện tại, vì vậy bạn sẽ phải đặt group_leader cho tất cả các quy trình mà bạn muốn chuyển hướng đến tệp.

Các giải pháp có thể được tinh chế tất nhiên, ví dụ bằng cách đẻ trứng một quá trình máy chủ mà ủy nhiệm thông điệp yêu cầu io đến file xoay vv

+0

Rất tiếc! Có thể khá hữu ích – gleber

1

Bạn có thể biên dịch lại mã của bạn với một phân tích biến đổi, biến đổi các cuộc gọi như

io:format("~p~n", "Hello world!") 

vào cuộc gọi như

io:format(whereis(my_output_file), "~p~n", "Hello world!") 

thêm vào đó bạn cần để thêm video này vào mã khởi động của bạn, và bạn đang thực hiện:

{ok, F} = file:open("file", [write]), 
register(my_output_file, F), 
Các vấn đề liên quan