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}
).
Не уверен, что это лучший способ обойти эту проблему. Я подумаю об этом.
Наконец, этот вопрос кажется дубликатом этого потока.