【问题标题】:Redirect output from erlang shell into a file将 erlang shell 的输出重定向到文件中
【发布时间】:2011-01-09 13:58:08
【问题描述】:

有没有办法将io:format() 打印的数据从erlang shell 重定向到文件中?我知道我可以打开一个文件(IoDevice)并将数据直接写入其中,但它需要更改代码,我现在不想这样做。

【问题讨论】:

    标签: erlang


    【解决方案1】:

    只需使用erl -noinput -s module function -s init stop > file 运行它。

    这是一个例子。

    Erlang 代码:

    -module(test).    
    -compile(export_all).
    
    function() ->
       io:fwrite("Hello world!~n").
    

    在外壳中:

    $ erlc test.erl 
    $ erl -noinput -s test function -s init stop > test.txt
    $ cat test.txt
    Hello world!
    

    【讨论】:

      【解决方案2】:

      你也可以在 io:fwrite/3 中使用 IODevice 参数,当你不希望它指向某个文件时,让它具有原子值 standard_io。否则给它文件。

      请参阅io module 文档的“标准输入/输出”部分。

      【讨论】:

        【解决方案3】:

        当一个进程调用io:format()和类似函数时,该进程会向其group_leader进程发送io请求消息。因此,一个简单的技巧是打开一个文件,并将其设置为产生输出的进程的 group_leader。这是一个将 shell 进程的输出重定向到文件的示例。

        1> {ok, F} = file:open("z", [write]).
        {ok,<0.36.0>}
        2> group_leader(F, self()).
        3> io:format("Where am I going to appear?~n").       
        4>
        

        这只会重定向当前的 shell 进程,因此您必须为所有要重定向到文件的进程设置 group_leader。

        当然可以改进解决方案,例如通过生成一个服务器进程,将 io 请求消息代理到旋转文件等。

        【讨论】:

        • 不错的技巧!可能很有帮助
        • 这是答案之后的年龄。但是我该如何撤消呢?比如,在这样做之后,我怎样才能再次开始在 shell 中重新获取消息?
        • 要将其打印回 shell,您可以执行 erlang:group_leader(io)。
        【解决方案4】:

        您可以使用解析转换重新编译您的代码,转换调用如

        io:format("~p~n", "Hello world!")
        

        像这样的电话

        io:format(whereis(my_output_file), "~p~n", "Hello world!")
        

        另外,您需要将其添加到您的启动代码中,然后您就完成了:

        {ok, F} = file:open("file", [write]),
        register(my_output_file, F),
        

        【讨论】:

          猜你喜欢
          • 2014-03-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-06
          • 2014-07-01
          • 1970-01-01
          • 1970-01-01
          • 2020-09-21
          相关资源
          最近更新 更多