Erlang:如何在文本文件中编写输出?

时间:2011-03-07 19:58:11

标签: erlang

我需要将shell中的输出写入文本文件以保留一些必需的记录。谁能告诉我怎么办?

由于

3 个答案:

答案 0 :(得分:25)

如果您希望将数据存储为单个术语,则可以阅读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])).

答案 1 :(得分:3)

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>

答案 2 :(得分:3)

有很多种可能性。这是我想到的第一个。

在Erlang中,每个进程都是的一部分。对于每个组,名为组长的进程将获取组配对的所有输出。 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()).

不起作用,因为它仍然太早(如{starting, started}所报告的那样,init仍在init:get_status()中。)

以同样的方式,通过使用HOME目录中的.erlang文件(每次启动shell时自动执行其行)来执行此操作将因类似原因而失败(init仍在{{ 1}}状态)。

不确定哪种方法可以避免这个问题。我会考虑一下。

最后,这个问题似乎与this thread重复。