`[` के साथ `-a` या` -ओ` संचालक का उपयोग कभी न करें


11

स्टीफन चेज़लस ने लिखा:

जैसे कुछ नियम

  • हमेशा चर बोलते हैं
  • -aया -oऑपरेटर का उपयोग कभी न करें (कई [कमांड &&और ||शेल ऑपरेटर का उपयोग करें)

[POSIX गोले के साथ विश्वसनीय बनाओ ।

क्यों " -aया -oऑपरेटर का उपयोग कभी नहीं "?

मैं "कई [कमांड &&और ||शेल ऑपरेटर का उपयोग कैसे कर सकता हूं "?

जवाबों:


13

क्यों " -aया -oऑपरेटर का उपयोग कभी नहीं "?

क्योंकि वे अमीर हो सकते हैं और इसलिए वे POSIX- अनुरूप नहीं हैं :

XSI एक्सटेंशन -a और -o बाइनरी प्राइमरी को निर्दिष्ट करता है और '(' और ')' ऑपरेटर्स को अप्रचलित चिह्नित किया गया है। (उनका उपयोग करने वाले कई अभिव्यक्ति अस्पष्ट रूप से व्याकरण द्वारा परिभाषित किए गए विशिष्ट अभिव्यक्तियों के आधार पर परिभाषित किए जाते हैं।) इन अभिव्यक्तियों का उपयोग करने वाले लिपियों को नीचे दिए गए रूपों में परिवर्तित किया जाना चाहिए। भले ही कई कार्यान्वयन इन अश्लील रूपों का समर्थन करना जारी रखेंगे, लेकिन स्क्रिप्ट को उपयोगकर्ता-प्रदत्त इनपुट से निपटने में बेहद सावधानी बरतनी चाहिए जो इन और अन्य प्राइमरी और ऑपरेटरों के साथ भ्रमित हो सकती है। जब तक एप्लिकेशन डेवलपर स्क्रिप्ट के लिए इनपुट उत्पन्न करने वाले सभी मामलों को नहीं जानता, जैसे कि चालान:

test "$1" -a "$2"

के रूप में लिखा जाना चाहिए:

test "$1" && test "$2"

मैं "कई [कमांड &&और ||शेल ऑपरेटर का उपयोग कैसे कर सकता हूं "?

कई परिचालनों को करने और उक्त ऑपरेटरों का उपयोग करके उनका पीछा करने से; उदाहरण के लिए:

[ 0 -eq 0 -a \( 0 -eq 1 -o 1 -eq 1 \) ]

समकक्ष के रूप में फिर से लिखा जा सकता है:

[ 0 -eq 0 ] && ([ 0 -eq 1 ] || [ 1 -eq 1 ])

या और अच्छा:

[ 0 -eq 0 ] && { [ 0 -eq 1 ] || [ 1 -eq 1 ]; }

धन्यवाद। (1) "द '(' और ')' ऑपरेटर्स को अप्रचलित चिह्नित किया गया है"। कर रहे हैं (और )ऑपरेटरों कि समूह आदेश? यदि वे अप्रचलित हैं, तो उनका प्रतिस्थापन क्या है? (२) test "$1" -a "$2"द्वारा test "$1" && test "$2"या उसके द्वारा प्रतिस्थापित किया जाना चाहिए ((test "$1" && test "$2"))? क्या हमें जरूरत नहीं है ((..))?
टिम

@ अद्यतन देखें। (1) हाँ - आप उपयोग कर सकते हैं ()और {}एक स्थानापन्न के रूप। (२) पहला वाला; (())का उपयोग अंकगणितीय विस्तार के लिए किया जाता है, यहां आप परीक्षणों की श्रृंखला की निकास स्थिति का परीक्षण करना चाहते हैं, इसलिए या तो परीक्षणों को एक उपधारा में ()या वर्तमान शेल में समूहित करें {}
कोस

धन्यवाद। मुझे लगता है कि मेरे सवाल इस पोस्ट से परे हो सकते हैं। इसलिए मैं उन्हें एक नई पोस्ट में पोस्ट करता हूं।
टिम

1
@Tim (और )ऑपरेटर्स का उपयोग करने का एकमात्र कारण यह है कि आप कब उपयोग कर रहे हैं -aया -o। चूंकि उत्तरार्द्ध अप्रचलित हैं, पूर्व स्पष्ट रूप से अब या तो आवश्यक नहीं हैं।
बमर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.