Erlang: Как написать мои выходы в текстовом файле?

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

Спасибо

Ответы

Ответ 1

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

$ 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 каждый процесс является частью группы. Для каждой группы руководитель группы с именем процесса получает все результаты от групповых товарищей. Процесс оболочки является частью группы 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 в вашем домашнем каталоге (строки которого автоматически выполняются каждый раз при запуске оболочки) завершится с ошибкой по той же причине (init все еще находится в состоянии {starting, applications_loaded}).

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

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