我需要将shell中的输出写入文本文件以保留一些必需的记录。谁能告诉我怎么办?
由于
答案 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重复。