将 erlang shell 的输出重定向到文件
有没有办法将 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
当进程调用 io:format() 和类似函数时,进程会向其 group_leader 进程发送 io 请求消息。因此,一个简单的技巧是打开一个文件,并将其设置为生成输出的进程的 group_leader 。下面是将 shell 进程的输出重定向到文件的示例。
这只会重定向当前的 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.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.
只需使用 erl -noinput -s module function -s init stop > 运行即可文件。
这是一个例子。
Erlang 代码:
在 shell 中:
Just run it with
erl -noinput -s module function -s init stop > file
.Here's an example.
Erlang code:
In shell:
您还可以使用 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.
您可以使用解析转换重新编译代码,将类似的调用转换
为类似
Plus 的调用,您需要将其添加到启动代码中,然后就完成了:
You can recompile your code with a parse transform, transforms calls like
into calls like
Plus you need to add this into your start-up code, and you are done: