दोनों stderr और stdout को / dev / null को / bin / sh के साथ रीडायरेक्ट करें


61

मैं तरीके दोनों रीडायरेक्ट करने के लिए हर तरह की कोशिश की है stdoutऔर stderrकरने के लिए /dev/nullकिसी भी सफलता नहीं मिली। मेरे पास लगभग पूरे जीवन चलने वाली बैश है जो मैंने इस मुद्दे के साथ कभी नहीं किया है, लेकिन बीएसडी में एक बार के लिए मैं इसके साथ फंस गया हूं /bin/sh

मैंने क्या कोशिश की है:

if ls ./python* 2> /dev/null; then
    echo found Python
fi

... जो काम करता है; यदि पायथन मौजूद नहीं है तो यह ls से त्रुटि संदेशों को म्यूट करेगा। हालाँकि, यदि python.tgzमौजूद है , तो आउटपुट वाली लाइन इस तरह दिखती है:

# ./test.sh
./python-2.7.3p1.tgz

मैंने कोशिश की:

if ls ./python* &> /dev/null; then
    echo found Python
fi

तथा

if ls ./python* 2>1 > /dev/null; then
    echo found Python
fi

तथा

if ls ./python* > /dev/null; then
    echo found Python
fi

वास्तव में कुछ भी काम नहीं करता है। मैं केवल एक ही आउटपुट को पुनर्निर्देशित कर सकता हूं, दोनों एक ही समय में नहीं।

जवाबों:


102

यह किसी भी Posix- संगत शेल में काम करेगा:

ls good bad >/dev/null 2>&1

आपको stderr में डुप्लिकेट करने से पहले stdout को पहले रीडायरेक्ट करना होगा ; यदि आप इसे पहले डुप्लिकेट करते हैं, तो stderr सिर्फ उसी बिंदु को इंगित करेगा जो मूल रूप से इंगित करता है।

बैश , zsh और कुछ अन्य गोले भी शॉर्टकट प्रदान करते हैं

ls good bad &>/dev/null

जो कमांड-लाइन पर सुविधाजनक है, लेकिन उन लिपियों से बचा जाना चाहिए जो पोर्टेबल होने का इरादा रखते हैं।


1
दरअसल, मैं बोर्न शेल मैनुअल पढ़ता हूं। यह कहा गया कि बाद के संस्करणों /bin/shने &>/dev/nullवाक्यविन्यास को लागू किया है, मोटे तौर पर ऐसा नहीं है या मेरे पास एक पुराना संस्करण है (जो मैं किसी भी तरह से प्रतिध्वनित नहीं कर सकता, OpenBSD 5.3 tho को चलाने के लिए पर्याप्त होना चाहिए)
Torxed

8
@Torxed, OpenBSD's shpdksh पर आधारित है। आजकल कोई बॉर्न शेल नहीं है। cshमें >&भी उपलब्ध है zshbashचुना &>(अब भी zshऔर कुछ pdkshडेरिवेटिव द्वारा समर्थित ) हालांकि यह स्पष्ट रूप से POSIX अनुपालन को तोड़ता है क्योंकि foo &> fileपूरी तरह से वैध POSIX वाक्यविन्यास है जिसका मतलब है कि कुछ पूरी तरह से अलग है।
स्टीफन चेज़लस

3
@ स्टीफनचैलेजेलस (...) जिसका अर्थ है कि कुछ पूरी तरह से अलग है आपने मुझे छोड़ दिया है और सोच रहा है कि इस मामले में इसका क्या मतलब है ... :)
पियोट्र डोब्रोगोस्ट

4
@PiotrDobrogost, foo &> fileऐसा है foo & > fileया foo & : > file, जो बिना किसी आदेश के लिखने के लिए पृष्ठभूमि और खुली फ़ाइल में foo चलाया जाता है (इस तरह उपयोग किए जाने की संभावना नहीं है)।
स्टीफन चेज़लस

5
@PiotrDobrogost, >&आदर्श नहीं है या तो वह विरोध करता के रूप में >&2, >&-ऑपरेटरों। zshइसे csh उपयोगकर्ताओं के लिए सुविधा के लिए जोड़ा (csh के पास नहीं है >&2)। वे सिर्फ़ वाक्यगत चीनी हैं, बस > file 2>&1जो मानक और पोर्टेबल है (बोर्न जैसे गोले के लिए) का उपयोग करें।
स्टीफन चेज़लस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.