【发布时间】:2011-03-07 19:58:11
【问题描述】:
我需要将 shell 的输出写入文本文件以保存一些必需的记录。谁能告诉我该怎么做?
谢谢
【问题讨论】:
-
this?
-
> file:write_file("test.txt", "Hello, world!").
标签: erlang
我需要将 shell 的输出写入文本文件以保存一些必需的记录。谁能告诉我该怎么做?
谢谢
【问题讨论】:
标签: erlang
如果您有想要存储为单个术语的数据,您可以阅读here。在最简单的情况下,您只需执行file:write_file(Path, Data)。如果您的数据更复杂,您可能希望使用io_lib:fwrite/2 以更易读的方式对其进行格式化。例如:
Data = [1,2,3,{car, "honda"}],
file:write_file("/tmp/foo", io_lib:fwrite("~p.\n", [Data])).
【讨论】:
tee 命令可以捕获 shell 输出并将其保存到文件中:
$ erl | tee output.txt
Eshell V5.8 (abort with ^G)
1> A = 5.
5
2> 5 + A.
10
3> ^Ca
$ cat output.txt
Eshell V5.8 (abort with ^G)
1> 5
2> 10
3>
【讨论】:
有很多可能性。这是我想到的第一个。
在 Erlang 中,每个进程都是一个组的一部分。对于每个组,一个名为 group leader 的进程从组成员那里获取所有输出。 shell 进程是组init 的一部分。所以,你可以做的是 change the group leader 为 shell 进程做:
{ok, Log} = file:open("log", [write]),
erlang:group_leader(Log, self()).
您可能希望创建一个专门的流程,充当组长,以更聪明的方式管理输出。例如,它可以在一段时间后或文件达到一定大小时包装文件。
这种方法的问题是您必须在每次启动 shell 时执行这些行。通过使用 -s 标志来做到这一点:
erl -s shell_log
shell_log 在哪里:
-module(shell_log).
-export([start/0]).
start() ->
{ok, Log} = file:open("log", [write]),
erlang:group_leader(Log, self()).
行不通,因为还为时过早(init 仍在{starting, started} 中,由init:get_status() 报告)。
以同样的方式,使用 HOME 目录中的 .erlang 文件(每次启动 shell 时会自动执行其行)将因类似原因而失败(init 仍处于 {starting, applications_loaded} 状态)。
不确定哪种方法是规避此问题的最佳方法。我会考虑的。
最后,这个问题似乎与this thread 重复。
【讨论】: