कोलन बिलिन किस उद्देश्य से कार्य करता है?


44

मैंने बहुत सारी शेल स्क्रिप्ट्स को हैक किया है, और कभी-कभी सबसे आसान चीजें मुझे चकरा देती हैं। आज मैं एक ऐसी पटकथा पर भागा, जिसने :(कोलोन) बैश बिलिन का व्यापक उपयोग किया ।

Documenation सरल पर्याप्त लगता है:

: (a colon)  
     : [arguments]  

तर्कों का विस्तार करने और पुनर्निर्देशन से परे कुछ भी न करें। वापसी की स्थिति शून्य है।

हालाँकि, मैंने पहले केवल शेल विस्तार के प्रदर्शनों में इसका उपयोग देखा है। इस संरचना के व्यापक उपयोग के बाद मैं जिस स्क्रिप्ट में चला, उसका उपयोग मामला:

if [ -f ${file} ]; then
    grep some_string ${file} >> otherfile || :
    grep other_string ${file} >> otherfile || :
fi

वहाँ वास्तव में सैकड़ों क्रेप्स थे, लेकिन वे सिर्फ एक ही अधिक हैं। कोई इनपुट / आउटपुट रीडायरेक्ट उपर्युक्त सरल संरचना के अलावा मौजूद नहीं है। स्क्रिप्ट में बाद में कोई रिटर्न मान चेक नहीं किए जाते हैं।

मैं इसे एक बेकार निर्माण के रूप में पढ़ रहा हूं जो "या कुछ भी नहीं" कहता है। "या कुछ भी नहीं" की सेवा के साथ इन उद्देश्यों को क्या समाप्त कर सकता है? किस मामले में यह निर्माण || :सभी उदाहरणों से अलग होने की तुलना में एक अलग परिणाम का कारण होगा ?


10
एक संभावित उद्देश्य :जिसे मैं देख सकता हूं वह है विकल्प के रूप में उपयोग करना true। शायद errexitसेट किया गया है और लेखक कुछ आदेशों की निकास स्थिति के बारे में परवाह नहीं करता है।
jw013


Stackoverflow से लिंक किया गया पृष्ठ IMO थोड़ा अधिक व्यापक है (इस पृष्ठ और लिंक किए गए पृष्ठ दोनों को पढ़ने के लिए अच्छा है)।
ट्रेवर बॉयड स्मिथ

जवाबों:


29

ऐसा प्रतीत होता है कि :आपकी स्क्रिप्ट के बदले में एस का उपयोग किया जा रहा है true। यदि grepफ़ाइल में कोई मेल नहीं मिलता है, तो यह एक नॉनज़ेरो एग्जिट कोड लौटाएगा; जैसा कि एक टिप्पणी में jw013 का उल्लेख है, अगर errexitसेट किया गया है, तो शायद शेबंग -eलाइन पर, स्क्रिप्ट बाहर निकल जाएगी यदि किसी भी grepमैच को खोजने में विफल हो। स्पष्ट रूप से, यह वह नहीं है जो लेखक चाहता था, इसलिए (ओं) ने || :उस विशेष यौगिक कमांड के निकास की स्थिति को हमेशा शून्य बनाने के लिए जोड़ा , जैसे कि अधिक सामान्य (मेरे अनुभव में) || true/ || /bin/true


ओह। यह RPM बिल्ड स्क्रिप्ट की अवधारणा में था, और जब मैंने स्क्रिप्ट के अंदर कोई भी एक्ज़िट कोड चेक नहीं किया, तो मैं यह विचार करना भूल गया कि मूल प्रक्रिया देख रही होगी।
कालेब

8
अगर ऐसा है, तो मैं इसे खराब स्क्रिप्टिंग अभ्यास कहूंगा। यह कार्यात्मक रूप से trueइसके बजाय उपयोग करने के लिए समान है , लेकिन शब्दार्थ आशय के साथ बहुत स्पष्ट है true:एक स्पष्ट एनओपी वांछित होने पर अधिक उपयुक्त है।
jw013

मेरे अनुभव में, यह RPM लिपियों में एक आम बात है। यह शायद नहीं होना चाहिए, लेकिन हम वहाँ हैं।
mattdm

कुछ शुद्धतावादी पसंद करते :हैं trueक्योंकि :एक bashअंतर्निहित बिल्ट है जहां trueआमतौर पर अधिक ओवरहेड के साथ एक संकलित बाइनरी है। आमतौर पर मैं उपयोग करता हूं trueक्योंकि कोड अधिक पठनीय है (इसी तरह मैं sourceइसके बजाय उपयोग करना पसंद करता हूं .)।
ट्रेवर बोयड स्मिथ

36

:Builtin भी बैश "असाइन मूलभूत मूल्यों" खोल विस्तार, जहां विस्तार अक्सर पक्ष प्रभाव के लिए पूरी तरह प्रयोग किया जाता है और विस्तारित मूल्य फेंक दी जाती है के साथ उपयोगी है:

# assign FOO=bar iff FOO is unset
: ${FOO:=bar}

2
यह देखने के लिए यहां आया था, चकित हो गया जब मैंने डिफ़ॉल्ट पैटर्न घोषित करने के लिए स्क्रिप्ट में इस पैटर्न को देखा।
ffledgling

20

मैं उन दो स्थानों के बारे में सोच सकता हूं जिनका मैंने :अतीत में उपयोग किया है।

while :
do
     shell commands
     some exit condition
done

वह हमेशा के लिए है।

function doSomethingStub {
    :
}

स्टब फ़ंक्शन में रखें, बस नियंत्रण के शीर्ष स्तर के प्रवाह को सही करने के लिए।

एक उपयोग मैंने पुराने दिनों में वापस देखा है: एक #!/bin/sh(या जो भी) लाइन के बजाय , आपको एक :रेखा दिखाई देगी । कुछ पुराने रियल यूनिक्स गुठली या रियल यूनिक्स के गोले का मतलब होता है कि "मैं एक शेल स्क्रिप्ट हूं, मुझे चलाया है"। जैसा कि मुझे याद है कि जब csh एक सामान्य इंटरैक्टिव शेल के रूप में इनरॉड बना रहा था।


@ ब्रूसइडर: क्या आपके पास "शेकेलॉन" लाइन का संदर्भ है?
l0b0

7
अंत में एक "स्क्रिप्ट: संदर्भ और स्पष्टीकरण की शुरुआत में" पाया गया: faqs.org/faqs/unix-faq/faq/part3/section-16.html
ब्रूस

1
के साथ शुरू में व्यवहार :बहुत ही अजीब है। मैंने पाया कि यह वास्तव में स्क्रिप्ट को चलाने का कारण बनता है sh। जैसे कि जब आप स्क्रिप्ट को शेबंग के बिना शुरू करते हैं ... यह स्क्रिप्ट को चलाने की कोशिश करता है जो भी शेल चल रहा है (इसलिए यदि आप bashइसे चला रहे bashहैं cshतो इसे चलाने की कोशिश करता है जैसे कि आपके पास है तो यह इसे चलाने की कोशिश करता है csh)।
ट्रेवर बॉयड स्मिथ

18

:निर्मित में पहले से ही था थॉम्पसन खोल - यह है प्रलेखित के लिए यूनिक्स वी 6 थॉम्पसन खोल में 1975 में, :के लिए एक लेबल संकेत दिया gotoआदेश। यदि आपने कभी भी gotoशुरुआत के साथ लाइन पर कॉल करने का प्रयास नहीं किया था, तो वह लाइन प्रभावी रूप से एक टिप्पणी थी।

बॉर्न शैल , बॉर्न / POSIX गोले के पूर्वज के रूप में हम उन्हें पता है, कभी नहीं एक था gotoकि मैं के बारे में पता है, लेकिन बरकरार रखा :नो-सेशन आदेश (यह पहले से ही में उपस्थित थे के रूप में यूनिक्स V7 )।


11

मैंने एक पुराना संदर्भ निकाला: "द यूनिक्स प्रोग्रामिंग एनवायरनमेंट" (सी) 1984 में कर्निघन और पाइक द्वारा।

पृष्ठ 147 (शैल प्रोग्रामिंग) यह कहता है:

":" एक शेल-इन-कमांड है जो कुछ भी नहीं करता है लेकिन इसके तर्कों का मूल्यांकन करता है और "सच" लौटाता है। इसके बजाय [एक स्क्रिप्ट उदाहरण का जिक्र करते हुए], हम सच का उपयोग कर सकते थे , जो केवल एक सही निकास स्थिति देता है। (एक झूठी कमांड भी है ।) लेकिन ':' सच की तुलना में अधिक कुशल है क्योंकि यह फाइल सिस्टम से कमांड निष्पादित नहीं करता है । [इटेलिक / जोर मेरा है]


2
बेशक, trueअब एक शेल बिल्डिन है, कई प्रणालियों पर भी।
ट्रिपलए

8

मुझे याद है कि शेल के शुरुआती संस्करणों में एक टिप्पणी वाक्यविन्यास नहीं था। के साथ शुरू होने वाली एक पंक्ति :(जो संभवतः एक वास्तविक निष्पादन योग्य होगी, उसी के समान /bin/true) सबसे अच्छा विकल्प होगा।

यहां प्राचीन थॉम्पसन शेल (कोई संबंध नहीं) के लिए एक आदमी पृष्ठ है ; किसी भी टिप्पणी वाक्यविन्यास का कोई उल्लेख नहीं है।


4
की उत्पत्ति :वास्तव में के लिए एक लेबल सूचक था gotoआदेश, कुछ प्राचीन खोल (मैं जो पता नहीं है) में। एक मेल : somethingवास्तव में एक टिप्पणी के रूप में इस्तेमाल किया जा सकता है, अगर कोई मेल नहीं था gotogotoगायब होने के बाद भी अभ्यास अटका रहा ।
गिल्स एसओ- बुराई को रोकना '

8

":" डिबगिंग के लिए आसान है।

DEBUGLOG=": debugfunction"

statement
statement
$DEBUGLOG arg1 arg2 ...
statement
statement

सामान्य रूप से डिबगफंक्शन चलाना कभी भी निष्पादित नहीं किया जाता है, इसलिए केवल नोओप (चर और वाइल्डकार्ड्स पर विस्तार किया जाता है) पर केवल कदम। यदि अधिक गहराई में डिबगिंग की आवश्यकता होती है, तो चर से नोओप हटा दें और डीबगफंक्शन को जो भी तर्क आवश्यक हैं, के साथ कहा जाता है।

एक अन्य उपयोगी उपयोग एक ब्लॉक टिप्पणी के रूप में है, जो शेल सिंटैक्स से एक लापता विशेषता है।

: << COMMENT
all --statements --in --here
are now -a here document which are
passed to --the noop
COMMENT
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.