Эрланг: Как записать мои выводы в текстовый файл? - PullRequest
16 голосов
/ 07 марта 2011

Мне нужно записать свои результаты из оболочки в текстовый файл для хранения некоторых необходимых записей.Может кто-нибудь сказать, пожалуйста, как я могу это сделать?

Спасибо

Ответы [ 3 ]

26 голосов
/ 07 марта 2011

Если у вас есть данные, которые вы хотите сохранить как один термин, вы можете прочитать, как здесь . В простейшем случае вы можете просто сделать 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])).
4 голосов
/ 07 марта 2011

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 голосов
/ 08 марта 2011

Есть много возможностей.Вот первое, что пришло мне в голову.

В Erlang каждый процесс является частью группы .Для каждой группы процесс с именем лидер группы получает все выходные данные от участников группы.Процесс оболочки является частью группы init .Итак, вы можете изменить лидера группы для процесса оболочки, выполнив:

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

Возможно, вы захотите создать выделенный процесс, действующий каклидер группы, который управляет выходом более умным способом.Например, он может обернуть файл через некоторое время или когда файл достигнет определенного размера.

Проблема этого подхода заключается в том, что вам необходимо выполнять эти строки каждый раз, когда вы запускаете оболочку.Выполнение этого с использованием флага -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()).

Таким же образом, сделав это, используя файл .erlang в каталоге HOME (строки которого автоматическивыполняется каждый раз, когда вы запускаете оболочку) по той же причине завершится неудачно (init все еще находится в состоянии {starting, applications_loaded}).

Не уверен, что это лучший способ обойти эту проблему.Я подумаю об этом.

Наконец, этот вопрос кажется дубликатом этой темы .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...