将erlang shell的输出重定向到文件中

时间:2010-01-26 16:05:11

标签: erlang

有没有办法将io:format()打印的数据从erlang shell重定向到文件中?我知道我可以打开一个文件(IoDevice)并直接将数据写入其中,但它需要更改代码,我现在不想这样做。

4 个答案:

答案 0 :(得分:12)

当进程调用io:format()和类似函数时,进程会向其group_leader进程发送io请求消息。所以一个简单的hack是打开一个文件,并将其设置为产生输出的进程的group_leader。以下是将shell进程的输出重定向到文件的示例。

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>

这只会重定向当前的shell进程,因此您必须为要重定向到该文件的所有进程设置group_leader。

当然可以改进解决方案,例如通过生成代理请求消息到旋转文件的服务器进程等。

答案 1 :(得分:8)

只需使用erl -noinput -s module function -s init stop > file运行它。

这是一个例子。

Erlang代码:

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

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

在shell中:

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

答案 2 :(得分:2)

您还可以将IODevice参数用于io:fwrite / 3,并且当您不希望它定向到某个文件时,让它具有原子值 standard_io 。否则给它文件。

请参阅io module文档的“标准输入/输出”部分。

答案 3 :(得分:1)

您可以使用解析转换重新编译代码,转换

之类的调用
io:format("~p~n", "Hello world!")

进入像

这样的电话
io:format(whereis(my_output_file), "~p~n", "Hello world!")

另外,您需要将此添加到您的启动代码中,然后就完成了:

{ok, F} = file:open("file", [write]),
register(my_output_file, F),