2010-01-26 9 views
5

में आउटपुट रीडायरेक्ट करें क्या io:format() द्वारा एरलांग शैल से मुद्रित डेटा को रीडायरेक्ट करने का कोई तरीका है? मुझे पता है कि मैं एक फ़ाइल (IoDevice) खोल सकता हूं और सीधे डेटा लिख ​​सकता हूं, लेकिन इसमें कोड परिवर्तन की आवश्यकता है और मैं अब नहीं करना चाहता हूं।एरलांग खोल से फ़ाइल को

उत्तर

8

बस इसे 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

तुम भी कब तक IODevice तर्क का उपयोग कर सकते हैं:/3 fwrite और जाने यह परमाणु मूल्य standard_io ही आपके लिए है यह कुछ फाइल को निर्देशित नहीं करना चाहता। अन्यथा इसे फ़ाइल दें।

io module के दस्तावेज़ के "मानक इनपुट/आउटपुट" खंड को देखें।

11

जब कोई प्रक्रिया io:format() और इसी तरह के कार्यों को कॉल करती है, तो प्रक्रिया आईओ अनुरोध संदेश को 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 सेट करना होगा।

समाधान एक सर्वर प्रक्रिया है जो घुमाया फ़ाइलों को कब अनुरोध संदेशों प्रॉक्सी को उत्पन्न करने से, निश्चित रूप से परिष्कृत किया जा सकता उदाहरण के लिए, आदि

+0

अच्छा हैक! काफी मददगार हो सकता है – gleber

1

आप के साथ एक को बदलने पार्स अपने कोड पुन: संयोजित कर सकते हैं, बदल देती कॉल की तरह

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),