2010-06-10 16 views
38

मैं रूबी स्क्रिप्ट के लिए फ़ाइल करने के लिए stderr और stdout को पुनर्निर्देशित कैसे करूं?रूबी स्क्रिप्ट के लिए फ़ाइल करने के लिए मैं stderr और stdout को रीडायरेक्ट कैसे करूं?

+1

संबंधित प्रश्न: http://stackoverflow.com/questions/4459330/how-do-i-temporarily-redirect-stderr-in-ruby –

उत्तर

5
./yourscript.rb 2>&1 > log.txt 

एक ही फ़ाइल में stdout और stderr को पुनर्निर्देशित करेगा।

+3

मान लिया जाये कि आप * nix पर चल रहे हैं –

+0

@Steve: मुझे लगता है कि '>' विंडोज़ पर काम करता है - मुझे यकीन है कि '2>' के बारे में निश्चित नहीं है। –

+2

यह विंडोज़ पर भी काम करेगा। – gthomaslynch

58
एक रूबी स्क्रिप्ट भीतर

से, आप stdout और stderrIO#reopen विधि के साथ अनुप्रेषित कर सकते हैं।

# a.rb 
$stdout.reopen("out.txt", "w") 
$stderr.reopen("err.txt", "w") 

puts 'normal output' 
warn 'something to stderr' 
 
$ ls 
a.rb 
$ ruby a.rb 
$ ls 
a.rb err.txt out.txt 
$ cat err.txt 
something to stderr 
$ cat out.txt 
normal output 
+2

सामान्य $ stdout फिर से कैसे बहाल किया जा सकता है? – shevy

+0

हमें फिर से विधि का उपयोग क्यों करना चाहिए? इसका मतलब यह है कि अगर "out.txt" मौजूद नहीं है, तो यह बनाया जाएगा? – wind

+0

बाद में $ stdout को पुनर्स्थापित करने के तरीके पर [इस उत्तर] (http://stackoverflow.com/a/22777806/1287376) पर एक नज़र डालें। –

13

नोट:/dev/बातिल करने के लिए मानक धाराओं के दोबारा खुलने एक प्रक्रिया की मदद करने के लिए एक डेमॉन बनने के लिए की एक अच्छी पुराना तरीका है। उदाहरण के लिए:

# daemon.rb 
$stdout.reopen("/dev/null", "w") 
$stderr.reopen("/dev/null", "w") 
+2

"प्रक्रिया को एक डिमन बनने में मदद करना" का क्या मतलब है? – silvamerica

+4

यूनिक्स में प्रोग्राम को एक डिमन बनाने के लिए प्रोग्रामर को इसे पृष्ठभूमि में केवल फोर्क नहीं करना चाहिए बल्कि इसकी मानक आईओ धाराओं को भी पुनर्निर्देशित करना चाहिए। क्या आप इससे परिचित हैं? –

+0

नोट: यदि अंतर्निहित 'Process.daemon' का उपयोग करना है तो यह आपके लिए यह कर सकता है। [यहां दस्तावेज़] देखें [http://ruby-doc.org/core-2.2.2/Process.html#method-c-daemon)। – captainpete

7
def silence_stdout 
    $stdout = File.new('/dev/null', 'w') 
    yield 
ensure 
    $stdout = STDOUT 
end 
+0

अच्छा, लेकिन यह बेहतर है, अगर एसटीडीओटी कुछ और था। http://stackoverflow.com/a/4459463/26604 –