Перенаправить вывод из оболочки erlang в файл - PullRequest
5 голосов
/ 26 января 2010

Есть ли способ перенаправить данные, напечатанные io:format() из оболочки erlang, в файл? Я знаю, что могу открыть файл (IoDevice) и записать данные непосредственно в него, но это требует изменения кода, и я не хочу делать это сейчас.

Ответы [ 4 ]

13 голосов
/ 27 января 2010

Когда процесс вызывает io:format() и подобные функции, процесс отправляет сообщения запроса io своему процессу group_leader. Таким образом, простой взлом состоит в том, чтобы открыть файл и установить его как group_leader процессов, производящих вывод. Вот пример перенаправления вывода процесса оболочки в файл.

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>

Это перенаправит только текущий процесс оболочки, поэтому вам придется установить group_leader для всех процессов, которые вы хотите перенаправить в файл.

Конечно, решение может быть улучшено, например, путем запуска серверного процесса, который передает сообщения запроса io в повернутые файлы и т. Д.

8 голосов
/ 26 января 2010

Просто запустите его с 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 голосов
/ 26 января 2010

Вы также можете использовать аргумент IODevice для io: fwrite / 3 и позволить ему иметь значение атома standard_io , если вы не хотите, чтобы оно направлялось в какой-либо файл. В противном случае передайте файл.

См. Раздел «Стандартный ввод / вывод» документации io .

1 голос
/ 27 января 2010

Вы можете перекомпилировать ваш код с помощью преобразования, преобразующего вызовы типа

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),
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...