【问题标题】:Erlang: How to write my outputs in a text file?Erlang:如何将我的输出写入文本文件?
【发布时间】:2011-03-07 19:58:11
【问题描述】:

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

谢谢

【问题讨论】:

  • this?
  • > file:write_file("test.txt", "Hello, world!").

标签: erlang


【解决方案1】:

如果您有想要存储为单个术语的数据,您可以阅读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])).

【讨论】:

    【解决方案2】:

    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>
    

    【讨论】:

      【解决方案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 重复。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-13
        • 1970-01-01
        • 1970-01-01
        • 2017-01-09
        相关资源
        最近更新 更多