2012-09-11 16 views
17

मैं इसके चारों ओर अपने सिर को लपेट नहीं सकता। /dev/null को if कथन में इनपुट के रूप में क्यों उपयोग किया जाएगा? निम्नलिखित में < /dev/null का उपयोग क्या है?अगर()</ dev/null

if ($PROG --version) </dev/null> /dev/null 2>&1; then 
     $PROG 
else 
     echo "failed" 
     exit 1 
fi 

मैं (लगता है) मैं समझता हूँ कि > /dev/null 2>&1 सिर्फ stdout और stderr दोनों में से किसी भी उत्पादन को दबाने के लिए प्रयोग किया जाता है।

उत्तर

15

तो $PROG एक प्रोग्राम है जो stdin से इनपुट की उम्मीद है, अपनी स्क्रिप्ट हमेशा के लिए रोकने सकता है आप में कुछ टाइप करने के लिए के लिए इंतज़ार कर रहा है। < /dev/null के उपयोग के इस तरह के एक कार्यक्रम के लिए एक खाली इनपुट प्रदान करना है। आप > और 2>&1 के बारे में सही हैं।

स्क्रिप्ट का यह स्निपेट यह देखने के लिए जांच कर रहा है कि $PROG --version 0 स्थिति (सफलता) से बाहर निकलता है, और उसके बाद उस प्रोग्राम को बिना किसी झंडे के चलाता है। यदि $PROG --version विफल रहता है, तो स्क्रिप्ट "विफल" हो जाती है और बाहर निकलती है।

+0

धन्यवाद। मुझे अभी भी यकीन नहीं है कि यह कितना उपयोगी है अगर मुझे पता है कि 'PROG' क्या है और मुझे पता है कि 'PROG --version' इनपुट की प्रतीक्षा नहीं कर रहा है। उदाहरण के लिए, 'PROG = autoconf' वह है जहां मैंने इसे देखा।और मुझे पता है कि 'autoconf --version' इनपुट की प्रतीक्षा नहीं कर रहा है। क्या यह अभी भी इस मामले में उपयोगी है? –

+0

@ करल नोरम, आदेश को निष्पादित करने के लिए 'if ('$ PROG --version') '(कोण ब्रैकेट के साथ) का उपयोग किया जा सकता है और इस प्रकार' fduff

+0

कोण ब्रैकेट्स? –

13

मुझे लगता है कि आप सोच रहे हैं कि पुनर्निर्देशन कोष्ठक के बाहर क्यों है।

इस पंक्ति में:

if ($PROG --version) </dev/null> /dev/null 2>&1; then 

कोष्ठकों if बयान की वाक्य रचना का हिस्सा नहीं हैं; वे बस कमांड ग्रुपिंग निर्दिष्ट करते हैं। (यह मुझे याद करने के लिए अपने आप को एक पल लिया, csh/tcsh में, कोष्ठकों एक if बयान की वाक्य रचना की हिस्सा हैं।)

उदाहरण के लिए, इस:

(echo one ; echo two) | tr a-z A-Z 

इस उत्पादन का उत्पादन होगा :

ONE 
TWO 

इस मामले में, $PROG --version के बाद से एक भी आदेश है, कोष्ठक अनावश्यक हैं (जब तक $PROG एक से अधिक आदेश के लिए विस्तारित, लेकिन यह संभावना नहीं है)।

तो पुनर्निर्देशन if कथन पर लागू नहीं होता है; यह $PROG --version पर लागू होता है। इसका उद्देश्य कोई इनपुट प्रदान नहीं करना है (जैसे कि खाली फ़ाइल से पढ़ना) $PROG पर, और stdout या stderr को लिखने वाले किसी भी चीज़ को त्यागना। यदि $PROG एक आदेश है जो stdin से पढ़ता है, भले ही --version के साथ बुलाया गया हो, तब इनपुट रीडायरेक्शन के बिना यह कीबोर्ड इनपुट के लिए प्रतीक्षा कर सकता है।

स्क्रिप्ट मानती है कि $PROG (जो भी हो सकता है) को आमंत्रित करना सुरक्षित है केवल $PROG --version त्रुटि उत्पन्न नहीं करता है।

ध्यान दें कि आप एक अगर बयान करने के लिए पुनर्निर्देशन आवेदन कर सकते हैं:

if test_command ; then 
    something 
else 
    something_else 
fi </dev/null> /dev/null 2>&1 

यह test_command, something, औरsomething_else के लिए इनपुट और आउटपुट पुनर्निर्देश।

+0

एक महान उत्तर के लिए धन्यवाद! मैं वास्तव में कोष्ठक के बारे में उलझन में था। मेरे लिए और उदाहरण देने के लिए इसे तोड़ने के लिए धन्यवाद। महान स्पष्टीकरण। –