`>> / देव / stderr` (सफेद स्थान के साथ) और`> और 2` में क्या अंतर है?


11

मारपीट में।

मुझे यह निर्धारित करने में कुछ कठिनाई हो रही है कि मुझे क्या उपयोग करना चाहिए?

मेरी सभी लिपियाँ ">> / dev / stderr" का उपयोग करती हैं

बैश प्रॉम्प्ट पर, अगर मैं कोशिश करूँ:
echo test >>/dev/stderrकाम
echo test >> /dev/stderrकरता है
echo test >/dev/stderrकाम
echo test > /dev/stderrकरता है काम करता है

echo test >>&2विफल रहता है!
echo test >> &2विफल रहता है!
echo test >&2कार्य करता है
echo test > &2!

मैं अपनी सभी लिपियों को बदलने के लिए तैयार हूं >&2

ऐसा लगता है कि ssh (बाद su SomeUser) पर भी बड़ा असर पड़ेगा जहां >>/dev/stderrकाम नहीं किया जाएगा (अनुमति से वंचित), केवल >&2काम करेगा।


क्या आप ssh त्रुटि का उदाहरण दिखा सकते हैं? मैं इसे पुन: पेश नहीं कर सकता।
जेफ स्कालर

@JeffSchaller आप सही हैं, इसके बाद ही suसमस्या होती है, इस सवाल को अपडेट किया गया
कुंभ पावर

@AquariusPower, ... उस विसंगति की व्याख्या करने के लिए, जिस तरह से: के साथ su -c 'some command', उस आदेश के द्वारा चलाया जाता है /bin/sh, नहीं bash, तो bash- विशिष्ट व्यवहार (जैसे कि /dev/stderrअनुपलब्ध उद्देश्यों के लिए अनुकरण जब उपलब्ध नहीं है) मौजूद होने की गारंटी नहीं है।
चार्ल्स डफी

जवाबों:


22

>& nएक फ़ाइल विवरणक को सीधे डुप्लिकेट करने के लिए शेल सिंटैक्स है । फ़ाइल डिस्क्रिप्टर 2 stderr है; यह कैसे काम करता है। आप अन्य फ़ाइल डिस्क्रिप्टर को भी डुप्लिकेट कर सकते हैं, न कि केवल stderr को। आप यहां अपेंड मोड का उपयोग नहीं कर सकते क्योंकि फाइल डिस्क्रिप्टर की नकल करना कभी भी कम नहीं करता (भले ही आपका स्टेडर एक फाइल है) और >&एक टोकन है, इसीलिए आप इसके अंदर जगह नहीं बना सकते हैं - लेकिन >& 2काम करता है।

>> nameएक अलग अनुमत वाक्य-विन्यास है, जहाँ nameएक फ़ाइल नाम (और टोकन है >>)। इस स्थिति में, आप फ़ाइल नाम का उपयोग कर रहे हैं /dev/stderr, जो कि OS- विशिष्ट हैंडलिंग (लिनक्स पर, यह एक सिमलिंक है /proc/self/fd/2) का अर्थ मानक त्रुटि भी है। एपेंड और ट्रंकट मोड दोनों एक ही काम कर रहे हैं जब स्टडर एक टर्मिनल है क्योंकि इसे छोटा नहीं किया जा सकता है। यदि आपकी मानक त्रुटि एक फ़ाइल है, हालाँकि, इसे काट दिया जाएगा :

anthony@Zia:~$ bash -c 'echo hi >/dev/stderr; echo bye >/dev/stderr' 2>/tmp/foo
anthony@Zia:~$ cat /tmp/foo
bye

यदि आप /dev/stderrssh के साथ कोई त्रुटि देख रहे हैं , तो संभव है कि सर्वर व्यवस्थापक ने कुछ सुरक्षा उपाय लागू किए हों जो उस सिम्कलिन को काम करने से रोक रहे हों। (उदाहरण के लिए, आप उपयोग नहीं कर सकते /procया /dev)। हालांकि मुझे उम्मीद है कि या तो सभी प्रकार के अजीब टूटने का कारण होगा, डुप्लिकेट फ़ाइल डिस्क्रिप्टर सिंटैक्स का उपयोग करना एक पूरी तरह से उचित (और संभवतः थोड़ा और अधिक कुशल) दृष्टिकोण है। व्यक्तिगत रूप से मैं इसे पसंद करता हूं।


मुझे उस ट्रंककेट समस्या को दोहराने की कोशिश करने में एक बड़ी परेशानी हो रही थी, जो कि पहले थी (अन्यथा मैंने उस प्रश्न को आगे जोड़ा होगा), जिस कारण से मैंने उपयोग करने के लिए सब कुछ बदल दिया >>, उस ओर इशारा करने के लिए thx! इसके अलावा, मैं su SomeUserथ्रू ssh को जोड़ने के बाद एक कदम चूक गया ।
कुंभ राशि

यह bash -c 'echo hi >&2; echo bye >&2' 2>/tmp/foo;cat /tmp/fooअभ्यस्त नहीं है! (यहां तक ​​कि 2>&1 |tee /tmp/foo) लॉगिंग के लिए क्या सही है, और मैं इसे पूरी तरह से बदलने के बाद पूरी तरह से काम करूंगा >&2। इसलिए मुझे लगता है कि केवल एक सीधे फ़ाइल का उपयोग /dev/stderrट्रंकटिंग की अनुमति देता है, न कि डुप्लिकेट किए गए डिस्क्रिप्टर, कूल thx का!
कुंभ राशि

@AquariusPower सही, डुप्लिकेट फ़ाइल डिस्क्रिप्टर कभी नहीं काटता है। यह पहले पैराग्राफ में है, शायद मुझे इसे किसी तरह उजागर करने की आवश्यकता है?
20-30

जरूरत नहीं है, मैं धीमी गति से कभी-कभी ehehe हूं
कुंभ पावर

3
इस उत्तर को बेहतर बनाया जा सकता है। > और एक नहीं दो टोकन हैं और झूठ की ओपी भ्रम में है।
यहोशू

8

विफलता के मामले होते हैं क्योंकि रीडायरेक्शंस में उपयोग करने के लिए बैश सिंटैक्स& एक निर्दिष्ट करता है >, और इसके लिए यह आवश्यक है कि यह सीधे &संकेत से सटे मौजूद हो :

[N]> और शब्द


2

'>'रीडायरेक्ट करने के लिए उपयोग करें (यदि मौजूद है तो ट्रंकट्स) या '>>'(यदि मौजूद हो तो)।

'>&'उदाहरण के लिए, एक स्ट्रीम को डुप्लिकेट करने के लिए उपयोग करें , यदि आप मानक आउटपुट और मानक त्रुटि उसी फ़ाइल में चाहते हैं, तो आप फ़ाइल को रीडायरेक्ट करते हैं '> output.log'और साथ ही त्रुटि भी'2>&'

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