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

Kon*_*tin 5 erlang

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

Zed*_*Zed 13

当进程调用io:format()和类似的函数时,该进程将io请求消息发送到其group_leader进程.所以一个简单的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>
Run Code Online (Sandbox Code Playgroud)

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

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


gle*_*ber 8

只需运行它erl -noinput -s module function -s init stop > file.

这是一个例子.

Erlang代码:

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

function() ->
   io:fwrite("Hello world!~n").
Run Code Online (Sandbox Code Playgroud)

在shell中:

$ erlc test.erl 
$ erl -noinput -s test function -s init stop > test.txt
$ cat test.txt
Hello world!
Run Code Online (Sandbox Code Playgroud)