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