रूबी में $ stdout और STDOUT के बीच अंतर


89

रूबी में, $stdout(डॉलर चिह्न से पहले) और STDOUT(सभी कैप्स में) के बीच क्या अंतर है ? आउटपुट पुनर्निर्देशन करते समय, जिसका उपयोग किया जाना चाहिए और क्यों? उसी के लिए चला जाता है $stderrऔर STDERR

संपादित करें: बस एक संबंधित प्रश्न पाया ।



@TheTinMan कुछ हद तक यह एक डुप्लिकेट है। हालाँकि यह ध्यान दिया जाना चाहिए कि जबकि बीच के अंतर $stdoutऔर STDOUTबनाम $stdinऔर STDINसममित हैं, बीच $stdoutऔर $>बनाम के अंतर $stdinऔर $<नहीं हैं।
स्कैल

जवाबों:


108

$stdoutएक वैश्विक चर है जो वर्तमान मानक आउटपुट का प्रतिनिधित्व करता है। मानक आउटपुट STDOUTका एक निरंतर प्रतिनिधित्व है और आमतौर पर इसका डिफ़ॉल्ट मान है $stdout

STDOUTएक स्थिर होने के साथ , आपको इसे फिर से परिभाषित नहीं करना चाहिए, हालांकि, आप $stdoutत्रुटियों / चेतावनियों के बिना फिर से परिभाषित कर सकते हैं (पुनः परिभाषित STDOUTएक चेतावनी बढ़ाएगा)। उदाहरण के लिए, आप कर सकते हैं:

$stdout = STDERR

उसी के लिए चला जाता है $stderrऔरSTDERR


इसलिए, अपने प्रश्न के दूसरे भाग का उत्तर देने के लिए, आउटपुट को रीडायरेक्ट करने के लिए वैश्विक चर का उपयोग करें, न कि स्थिरांक। बस अपने कोड में इसे वापस बदलने के लिए सावधान रहें, वैश्विक चर को फिर से परिभाषित करना आपके आवेदन के अन्य हिस्सों को प्रभावित कर सकता है।


3
वास्तव में, यदि आप आउटपुट को रीडायरेक्ट करना चाहते हैं, तो आपको संभवतः $>डिफ़ॉल्ट आउटपुट स्ट्रीम का उपयोग करना चाहिए , न कि $stdout
जोर्ग डब्ल्यू मित्तग

10
बस एक और सवाल पर एक टिप्पणी मिली जो कहती है $stdoutऔर $>उपनाम हैं, इसलिए एक को फिर से सौंपना दूसरे को प्रभावित करेगा।
जूनोको

9
@jrdioko: आप सही कह रहे हैं। जाहिरा तौर पर, मैं न केवल हर दिन कुछ नया सीखता हूं, मैं हर दिन कुछ भी भूल जाता हूं :-)
जोर्ग डब्ल्यू मित्तग

2
और अधिक पढ़ने, ऐसा लगता है कि सरल असाइनमेंट के बजाय IO # reopen का उपयोग करना बेहतर है ।
१r:५३ पर जूनियर

@jrdioko आपको क्यों लगता है कि इसके IO#reopenमामले में उपयोग करना बेहतर है $stdout? मैं इस राय से पूरी तरह असहमत हूं। $stdout.reopenविधि mutates अपने रिसीवर और वह भी प्रभावित करेगा STDOUTयदि आप पुन: असाइन नहीं किया है $stdoutपहले। वे पर्यायवाची होने के लिए नहीं हैं, यह कुछ भी बुरा नहीं है जब वे असाइनमेंट के कारण अलग-अलग मान रखते हैं, और फिर से खोलने से STDOUTआप इसका उद्देश्य तोड़ रहे हैं।
स्केल

5
  • STDOUT एक वैश्विक स्थिरांक है, इसलिए इसे बदला नहीं जाना चाहिए।
  • $stdout पूर्वनिर्धारित चर है, इसलिए इसे बदला जा सकता है।

यदि आप पुनर्निर्देशन करने के लिए शेल का उपयोग कर रहे हैं:

$ ruby test.rb > test.log

फिर इससे कोई फर्क नहीं पड़ता कि आप अपनी स्क्रिप्ट के लिए फाइल डिस्क्रिप्टर के रूप में किसका उपयोग करते हैं, आपकी स्क्रिप्ट निष्पादित होने से पहले निर्धारित की जा रही है।

हालाँकि, यदि आप अपने रूबी लिपि के भीतर से OS के STDOUT के लिए फ़ाइल डिस्क्रिप्टर को बदलने का प्रयास कर रहे हैं, उदाहरण के लिए, सप्ताह के वर्तमान दिन के आधार पर लॉग फ़ाइलों के घूर्णन सेट में आउटपुट भेजने के लिए, तो आप यह सुनिश्चित करना चाहेंगे। आप का उपयोग $stdout


5
"STDOUT एक वैश्विक स्थिरांक है, इसलिए इसका बदलाव नहीं होने वाला है"। यह एक स्थिरांक है, जिसे बदला जा सकता है, लेकिन एक चेतावनी जारी की जाएगी। STDOUT = $stderr (irb):1: warning: al#=> #<IO:<STDERR>>constant STDOUT >> STDOUT #=> #<IO:<STDERR>>
टिन मैन

आह हाँ, इसलिए कहना चाहिए "तो इसे बदला नहीं जाना चाहिए"। धन्यवाद!
शकेर्लक्सव

5

दोनों $stdoutऔर STDOUTअलग अलग अर्थ है। इस विषय पर रूबी का दस्तावेज बहुत स्पष्ट है:

  • $stdout - वर्तमान मानक आउटपुट।
  • STDOUT- मानक उत्पादन। $ Stdout के लिए डिफ़ॉल्ट मान।

जब आप मानक आउटपुट पर लिखना चाहते हैं, तो आप वास्तव में वर्तमान मानक आउटपुट से मतलब रखते हैं , इस प्रकार आपको लिखना चाहिए $stdout

STDOUTबेकार भी नहीं है। यह के लिए डिफ़ॉल्ट मान संग्रहीत करता है $stdout। यदि आप कभी भी पुनर्मूल्यांकन करते हैं $stdout, तो आप इसे पिछले मान से पुनर्स्थापित कर सकते हैं $stdout = STDOUT

इसके अलावा, एक और पूर्वनिर्धारित चर है:

  • $>- प्रिंट, प्रिंटफ के लिए डिफ़ॉल्ट आउटपुट, जो $stdoutडिफ़ॉल्ट रूप से है।

हालांकि यह रूबी 2.3 में दिखता है यह बस के लिए एक उपनाम के रूप में व्यवहार करता है $stdout। पुन: असाइन करने $stdoutसे $>और इसके विपरीत का मूल्य बदल जाता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.