ऐतिहासिक रूप से , बॉर्न के गोले true
और false
अंतर्निहित कमांड के रूप में नहीं थे । true
इसके बजाय बस करने के लिए :
और false
कुछ करने के लिए उपनाम दिया गया थाlet 0
।
:
true
प्राचीन बोर्न-व्युत्पन्न गोले के लिए पोर्टेबिलिटी की तुलना में थोड़ा बेहतर है । एक सरल उदाहरण के रूप में, न तो !
पाइपलाइन ऑपरेटर और न ही ||
सूची ऑपरेटर होने पर विचार करें (जैसा कि कुछ प्राचीन बॉर्न गोले के लिए मामला था)। यह कथन का else
खंड छोड़ देता है if
क्योंकि निकास स्थिति के आधार पर शाखाकरण के लिए एकमात्र साधन है:
if command; then :; else ...; fi
चूंकि if
एक गैर-खाली then
क्लॉज की आवश्यकता होती है और टिप्पणियां गैर-रिक्त के रूप में गणना नहीं :
करती हैं , इसलिए यह नो-ऑप के रूप में कार्य करता है।
आजकल (यह है: एक आधुनिक संदर्भ में) आप आमतौर पर :
या तो उपयोग कर सकते हैं या true
। दोनों POSIX द्वारा निर्दिष्ट हैं, और कुछ true
पढ़ने में आसान लगते हैं। हालांकि एक दिलचस्प अंतर है: :
एक तथाकथित POSIX विशेष अंतर्निहित है , जबकि true
एक नियमित रूप से अंतर्निहित है ।
विशेष निर्मित-इन को शेल में बनाया जाना आवश्यक है; नियमित रूप से निर्मित इन्स केवल "आम तौर पर" में निर्मित होते हैं, लेकिन इसकी कड़ाई से गारंटी नहीं है। आमतौर पर अधिकांश प्रणालियों के पथ में :
कार्य के साथ नाम का एक नियमित कार्यक्रम नहीं होना चाहिए true
।
संभवतः सबसे महत्वपूर्ण अंतर यह है कि विशेष निर्मित-इन के साथ, अंतर्निहित कमांड द्वारा निर्धारित परिवेश में भी कोई भी चर - कमांड पूरा होने के बाद भी बना रहता है, जैसा कि यहां ksh93 का उपयोग करके दिखाया गया है:
$ unset x; ( x=hi :; echo "$x" )
hi
$ ( x=hi true; echo "$x" )
$
ध्यान दें कि Zsh इस आवश्यकता को अनदेखा करता है, जैसे कि POSIX संगतता मोड में काम करने के अलावा GNU बैश होता है, लेकिन अन्य सभी प्रमुख "POSIX sh व्युत्पन्न" गोले डैश, ksh93 और mksh सहित इसका निरीक्षण करते हैं।
एक और अंतर यह है कि नियमित रूप से निर्मित इन्स के साथ संगत होना चाहिए exec
- बैश का उपयोग करके यहां प्रदर्शित:
$ ( exec : )
-bash: exec: :: not found
$ ( exec true )
$
POSIX भी स्पष्ट रूप से नोट करता है जो :
इससे तेज हो सकता है true
, हालांकि यह निश्चित रूप से कार्यान्वयन-विशिष्ट विवरण है।