कैसे और क्यों) पढ़ने और लिखने दोनों के लिए stderr का उपयोग करें?


12

विद्वानों के इस उत्तर के अनुसार , lessअगर यह खोलने में सक्षम नहीं है , तो स्टडर से नेविगेशन कमांड पढ़ता है /dev/tty

यह हैरान करने वाला प्रतीत होता है, क्योंकि मैंने कभी भी किसी अन्य कार्यक्रम की stderr स्ट्रीम पर लिखने के लिए नहीं देखा है, और मुझे नहीं पता कि मैं इसे कैसे पूरा करूंगा।

पढ़ने और लिखने दोनों के लिए स्टैडर का उद्देश्य क्या है? और अगर यह उपयोगी है, तो मैं इसे आधुनिक प्रणालियों पर कैसे उपयोग करूं? (उदाहरण के लिए, स्टड्र के बजाय कुछ को पाइप करने के लिए कुछ आर्कन सिंटैक्स है?)

जवाबों:


7

मैं पहले तो हैरान था। हालाँकि उत्तर पढ़ने के बाद, और थोड़ी जाँच पड़ताल करने पर, यह सरल लगता है। तो यहाँ वही है जो मैंने पाया है। (अंत में कोई आश्चर्य नहीं हुआ।)

पुनर्निर्देशन से पहले, स्टडआउट, और स्टडर उसी डिवाइस से जुड़े होने की उम्मीद है।

#ctrl-alt-delor:~$
#↳ ll /dev/std*
lrwxrwxrwx 1 root root 15 Jun  3 20:58 /dev/stderr -> /proc/self/fd/2
lrwxrwxrwx 1 root root 15 Jun  3 20:58 /dev/stdin -> /proc/self/fd/0
lrwxrwxrwx 1 root root 15 Jun  3 20:58 /dev/stdout -> /proc/self/fd/1

#ctrl-alt-delor:~$
#↳ ll /proc/self/fd/*
lrwx------ 1 richard richard 64 Jun 30 19:14 /proc/self/fd/0 -> /dev/pts/12
lrwx------ 1 richard richard 64 Jun 30 19:14 /proc/self/fd/1 -> /dev/pts/12
lrwx------ 1 richard richard 64 Jun 30 19:14 /proc/self/fd/2 -> /dev/pts/12

इसलिए अधिकांश पुन: दिशाओं के बाद (जो कि स्टादर है) को पुनर्निर्देशित नहीं किया जाता है। stderr अभी भी टर्मिनल से जुड़ा हुआ है। इसलिए इसे पढ़ा जा सकता है, कीबोर्ड इनपुट प्राप्त करने के लिए।

केवल एक चीज जो अप्रत्याशित दिशा में उपयोग की जा रही फाइलों को रोक रही है वह है कन्वेंशन, और पाइप यूनिडायरेक्शनल हैं।

एक और उदाहरण, कोशिश करें:

cat | less

यह एक पृष्ठ के बाद गलत हो जाता है, जब lessटर्मिनल को पढ़ने की कोशिश करता है (यह आश्चर्य की बात नहीं है, जैसा catकि टर्मिनल भी पढ़ रहा है)।

/dev/ttyअधिक रहस्यमय है, यह एक कड़ी नहीं है /proc/self

#ctrl-alt-delor:~$
#↳ ll /dev/tty
crw-rw-rw- 1 root tty 5, 0 Jun 29 09:18 /dev/tty

देखें कि मेरे वर्तमान नियंत्रण टर्मिनल और `/ देव / tty` के बीच क्या संबंध हैं? एक खोज के लिए। लिंक के लिए @StephenKitt को धन्यवाद।


इस प्रश्न के संबंध में /dev/tty, देखें ।
स्टीफन किट

6

जब आप लॉग इन करते हैं, तो stdin, stdout और stderr उस टर्मिनल से जुड़े होते हैं जहाँ से आप लॉग इन करते हैं। अधिक सटीक होने के लिए, tty को टाइप करके खोला जाता है और stdout और stderr dup(2)पहले दो संचालन विवरणक पर दो ऑपरेशनों के परिणामस्वरूप होते हैं । यह stderr से पढ़ने की अनुमति देता है ताकि टर्मिनलों से इनपुट प्राप्त किया जा सके।

जैसा कि अन्य उत्तर में उल्लेख किया गया है, किसी प्रश्न पर संवादात्मक उत्तर प्राप्त करने के लिए प्रोग्रामर से प्रोग्राम पढ़ता है।

चूंकि एक उपयोगकर्ता यह नहीं जान सकता है कि प्रोग्रामर किन परिस्थितियों में stderr से पढ़ता है, इसलिए यह जानबूझकर दूसरे प्रोग्राम से stderr में डेटा लिखने का एक बेकार प्रयास है।

ध्यान दें कि आज के कार्यक्रम आमतौर पर /dev/ttyकेवल उस स्थिति में स्टैडर को खोलने और उपयोग करने का प्रयास करते हैं जो काम नहीं करता है।

प्रोग्राम जो केवल स्टडर से पढ़े जाते हैं, उन्हें आमतौर पर 1979 से पहले कभी संशोधित नहीं किया गया था और ऐसे कार्यक्रमों में सामान्य रूप से निर्माण होते हैं जैसे:

int i 1;

या

i =* 2;

यह आधुनिक सी कंपाइलरों द्वारा स्वीकार नहीं किया जाता है। नतीजतन, यह सबसे अधिक संभावना नहीं है कि आप आज एक कार्यक्रम पाएंगे जो कभी नहीं खुलता है /dev/tty, बल्कि स्टैडर से इंटरएक्टिव उत्तर पढ़ता है।


इसलिए यदि मैं सही समझ रहा हूं, तो शेल को रीडायरेक्ट होने पर (पाइप या अन्य साधनों से) stderrअप्रत्यक्ष रूप से जोड़ा जाता stdinहै? या सिर्फ हमेशा stderrट्टी से जुड़ता है?
ड्रेकोनिस

1
जब आप लॉग इन करते हैं, तो stderr आपके लॉगिन टर्मिनल से जुड़ा होता है।
sch

2
i =+ 1पूरी तरह से वैध सी है, और इसके बराबर है i = (+1)। दी, पूर्व सी अंडरहैंड सी प्रतियोगिता के लिए अच्छा उम्मीदवार है।
जी। स्लीपेन

1
ठीक है, यह हो सकता है कि यह सिर्फ एक चेतावनी बनाता है। मैंने 1977 में C से कोड को कुछ और में बदल दिया।
schily

1
ऐसा लगता है कि मैं और अधिक गोले के बारे में पता कर रहा हूँ, क्योंकि मैं है कम से कम एक खोल है कि इसके मानक इनपुट के अलावा अन्य से पढ़ता है के बारे में पता । (-:
JdeBP
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.