मुझे लगता है कि आप सोच रहे हैं कि पुनर्निर्देशन कोष्ठक के बाहर क्यों है।
इस पंक्ति में:
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
के लिए इनपुट और आउटपुट पुनर्निर्देश।
स्रोत
2012-09-11 07:01:33
धन्यवाद। मुझे अभी भी यकीन नहीं है कि यह कितना उपयोगी है अगर मुझे पता है कि 'PROG' क्या है और मुझे पता है कि 'PROG --version' इनपुट की प्रतीक्षा नहीं कर रहा है। उदाहरण के लिए, 'PROG = autoconf' वह है जहां मैंने इसे देखा।और मुझे पता है कि 'autoconf --version' इनपुट की प्रतीक्षा नहीं कर रहा है। क्या यह अभी भी इस मामले में उपयोगी है? –
@ करल नोरम, आदेश को निष्पादित करने के लिए 'if ('$ PROG --version') '(कोण ब्रैकेट के साथ) का उपयोग किया जा सकता है और इस प्रकार' dev/null' की आवश्यकता नहीं है? – fduff
कोण ब्रैकेट्स? –