2010-01-26 9 views
5

¿Hay alguna manera de redirigir los datos impresos por io:format() desde el shell erlang a un archivo? Sé que puedo abrir un archivo (IoDevice) y escribir datos directamente en él, pero requiere un cambio de código y no quiero hacerlo ahora.Redirigir la salida del shell erlang a un archivo

Respuesta

8

Simplemente ejecútelo con erl -noinput -s module function -s init stop > file.

Aquí hay un ejemplo. código

Erlang:

-module(test).  
-compile(export_all). 

function() -> 
    io:fwrite("Hello world!~n"). 

Con cáscara:

$ erlc test.erl 
$ erl -noinput -s test function -s init stop > test.txt 
$ cat test.txt 
Hello world! 
2

También puede utilizar el argumento IODevice a Io: fwrite/3 y hacer que tenga el valor átomo de standard_io cuando Don No quiero que se dirija a algún archivo. De lo contrario, dele el archivo.

Consulte la sección "Entrada/Salida estándar" de la documentación de io module.

11

Cuando un proceso llama a io:format() y funciones similares, el proceso envía mensajes de solicitud a su proceso group_leader. Entonces, un simple hack es abrir un archivo y establecerlo como group_leader de los procesos que producen el resultado. Aquí hay un ejemplo de redirigir la salida del proceso de shell a un archivo.

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> 

Esto sólo redirigir el proceso de shell actual, por lo que tendrá que establecer el group_leader para todos los procesos que le gustaría volver a dirigir al archivo.

La solución puede ser refinado por supuesto, por ejemplo, lanzando un proceso servidor, que proxies io mensajes de solicitud a los archivos rotados, etc.

+0

¡Bonito hack! Podría ser bastante útil – gleber

1

Puede volver a compilar el código con un parse transformar, transforma las llamadas como

io:format("~p~n", "Hello world!") 

en llamadas como

io:format(whereis(my_output_file), "~p~n", "Hello world!") 

Plus es necesario agregar esto en su código de puesta en marcha, y ya está:

{ok, F} = file:open("file", [write]), 
register(my_output_file, F), 
Cuestiones relacionadas