2011-03-07 85 views

回答

21

如果你想保存为单个字词的数据,你可以了解如何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])). 
3

tee命令可以捕获外壳输出,并将其保存到一个文件:

$ 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> 
3

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

在Erlang中,每个进程都是组的一部分。对于每个组,一个过程 - 名为组长获取来自组队的所有输出。 shell进程是组init的一部分。所以,你可以做的是change the group leader的外壳工艺做:

{ok, Log} = file:open("log", [write]), 
erlang:group_leader(Log, self()). 

您可能需要创建作为组长谁管理更聪明的方式输出专用的过程。例如,它可能会在一段时间后或文件达到一定大小时打包文件。

这种方法的问题是,你必须在你启动shell的任何时候执行这些行。

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仍然是通过使用-s标志做如,如init:get_status()所报道)。

以同样的方式,通过在您的HOME目录中使用.erlang文件(每次启动shell时会自动执行这些文件)执行此操作也会因类似原因(init仍处于{starting, applications_loaded}状态)而失败。

不知道哪个是避免这个问题的最好方法。我会考虑一下。

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

相关问题