2011-03-07 7 views

답변

21

당신이 하나의 용어로 저장하고자하는 데이터가있는 경우는 here 방법을 읽을 수 있습니다. 가장 간단한 경우에는 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])). 
3

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

는 많은 가능성이 있습니다. 여기 내 마음에 온 첫 번째가 있습니다.

얼랑에서 모든 프로세스는 그룹의 일부입니다. 각 그룹에 대해 이라는 그룹 리더 인 프로세스이 그룹 메이트의 모든 출력을 가져옵니다. 쉘 프로세스는 init 그룹의 일부입니다. 그래서, 당신이 할 수있는 것은 수행하여 쉘 프로세스에 대한 change the group leader이다 :

{ok, Log} = file:open("log", [write]), 
erlang:group_leader(Log, self()). 

당신은 더 영리한 방법으로 출력을 관리하는 그룹 리더 역할을하는 전용 프로세스를 생성 할 수 있습니다. 예를 들어, 잠시 후 또는 파일이 특정 크기에 도달하면 파일을 감쌀 수 있습니다.

이 방법의 문제점은 쉘을 시작할 때마다이 줄을 실행해야한다는 것입니다.

가 ERL -s shell_log shell_log가

가 :

이 이
-module(shell_log). 

-export([start/0]). 

start() -> 
    {ok, Log} = file:open("log", [write]), 
    erlang:group_leader(Log, self()). 
이 (초기화 아직도 여전히 너무 일찍 때문에

가 작동하지 않습니다 입니다 -s 플래그를 사용하여 작업 수행 init:get_status()에 의해보고 된 바와 같이 {starting, started}에 있음).

마찬가지로, 홈 디렉토리의 .erlang 파일 (쉘을 시작할 때마다 자동으로 실행되는 파일)을 사용하면 비슷한 이유 (init는 여전히 {starting, applications_loaded} 상태 임)로 실패합니다.

이 문제를 우회하는 가장 좋은 방법은 무엇인지 잘 모릅니다. 나는 그것에 대해 생각합니다.

마지막으로이 질문은 this thread과 중복됩니다.

관련 문제