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

发布于 2024-08-19 09:25:24 字数 106 浏览 4 评论 0原文

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

Is there a way to redirect data printed by io:format() from erlang shell into a file ? I know that I can open a file (IoDevice) and write data directly into it, but it requires code change and I don't want to do now.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

木森分化 2024-08-26 09:25:24

当进程调用 io:format() 和类似函数时,进程会向其 group_leader 进程发送 io 请求消息。因此,一个简单的技巧是打开一个文件,并将其设置为生成输出的进程的 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。

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

When a process calls io:format() and similar functions, the process sends io request messages to its group_leader process. So a simple hack is to open a file, and set it as the group_leader of the processes producing the output. Here is an example of redirecting the shell process's output to a file.

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>

This will only redirect the current shell process, so you will have to set the group_leader for all processes which you would like to redirect to the file.

The solution can be refined of course, for example by spawning a server process which proxies io request messages to rotated files, etc.

把昨日还给我 2024-08-26 09:25:24

只需使用 erl -noinput -s module function -s init stop > 运行即可文件。

这是一个例子。

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!

Just run it with erl -noinput -s module function -s init stop > file.

Here's an example.

Erlang code:

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

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

In shell:

$ erlc test.erl 
$ erl -noinput -s test function -s init stop > test.txt
$ cat test.txt
Hello world!
伴梦长久 2024-08-26 09:25:24

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

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

You can also use the IODevice argument to io:fwrite/3 and let it have the atom value standard_io when you don't want it directed to some file. Otherwise give it the file.

See the "Standard Input/Output" section of the io module's documentation.

不即不离 2024-08-26 09:25:24

您可以使用解析转换重新编译代码,将类似的调用转换

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

为类似

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

Plus 的调用,您需要将其添加到启动代码中,然后就完成了:

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

You can recompile your code with a parse transform, transforms calls like

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

into calls like

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

Plus you need to add this into your start-up code, and you are done:

{ok, F} = file:open("file", [write]),
register(my_output_file, F),
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文