बैश नल-ऑपरेटर ":", कोलन का क्या मतलब है?


13

BASH स्क्रिप्ट में "null" ऑपरेटर का क्या मतलब है? मैं समझता हूं कि यह एक ifकमांड के रूप में एक प्लेसहोल्डर के रूप में उपयोग किया जाता है जब आपके पास कहने के लिए कुछ नहीं होता है, लेकिन प्रोग्राम को ठीक से चलाने की अनुमति देने के लिए एक कमांड की आवश्यकता होती है। लेकिन इसके लिए समग्र उपयोग क्या है? आप इसका उपयोग कब करेंगे? इसका उपयोग कब करना है?



1
आपके द्वारा उद्धृत किए जाने का कारण काफी महत्वपूर्ण है। आपको और क्यों चाहिए?
टेराडो

जवाबों:


16

यह कभी-कभी पैरामीटर विस्तार के साइड-इफेक्ट की अनुमति देने के लिए उपयोगी होता है।

उदाहरण के लिए, डिफ़ॉल्ट मान सेट करना

read -p "Enter your name: " name
: ${name:=John Doe}  # if the user entered an empty string
echo "$name"

2
क्या आप प्रतीक-दर-प्रतीक समझा सकते हैं कि दूसरी पंक्ति कैसे काम करती है?
रुस्लान

बैश मैनुअल में :कमांड और पैरामीटर विस्तार के बारे में पढ़ें ।
ग्लेन जैकमैन

4
@Glennjackman क्या संदर्भित कर रहा है, इसे रेखांकित करने के लिए, दूसरी पंक्ति शून्य कमांड को कॉल करती है: और ${name:="John Doe"}इसे विस्तारित किया जाएगा, जिससे असाइनमेंट हो जाएगा क्योंकि इसे एक तर्क के रूप में पढ़ा जाता है:। बिना: शेल एक कमांड के रूप में "जॉन डो" को चलाने का प्रयास करेगा, या $nameयदि यह पहले से सेट है तो मान
imkendal

13

आप अंतहीन छोरों के लिए भी इसका उपयोग कर सकते हैं:

while : ; do 
   # ....
done

4
लेकिन शायद while trueअधिक पठनीय है, क्योंकि (ए) यह कम विराम चिह्न का उपयोग करता है, और (बी) यह सी-व्युत्पन्न भाषाओं के समान है।
wchargin

9

आप प्रोग्राम चलाने के बिना एक फ़ाइल बनाने के लिए इसका उपयोग कर सकते हैं ::

: > /path/to/file

यह असीम रूप से तेज है touch /path/to/file (क्योंकि इसमें touchप्रोग्राम को चलाने की आवश्यकता नहीं है ) और केवल सादे की तुलना में थोड़ा अधिक पोर्टेबल हो सकता है

> /path/to/file

जो कई प्रणालियों पर काम करता है। इसी तरह, इसका उपयोग यह जांचने के लिए किया जा सकता है कि आपके पास किसी फ़ाइल तक पहुंच है या नहीं :

if { : >> /path/to/file;} 2> /dev/null
then
    echo "writeable"
else
    echo "write permission denied"
fi

हालांकि यह, भी, आम तौर पर बिना किया जा सकता है :। चेतावनियां:

  • यह जाँच नहीं करता है कि फ़ाइल पहले से मौजूद है या नहीं। यदि ऐसा नहीं होता है, तो यदि ऐसा करने की अनुमति है तो यह फाइल बनाएगा।
  • यदि फ़ाइल मौजूद नहीं है, और आपकी स्क्रिप्ट के पास इसे बनाने की अनुमति नहीं है, तो यह "लिखने की अनुमति से वंचित" रिपोर्ट करेगा।

(कारणों से जुड़ा हुआ प्रश्न देखें कि यह क्यों अधिक विश्वसनीय है if [ -w /path/to/file ]।)


5

यूनिक्स V6 और थॉम्पसन शेल में रास्ता वापस, :वास्तव में gotoबयान के हिस्से के रूप में इस्तेमाल किया गया था । मैनुअल के अनुसार , यह मूल रूप से यूनिक्स के संस्करण 3 में दिखाई दिया:

संपूर्ण कमांड फ़ाइल को एक लाइन के साथ शुरू होने के लिए खोजा जाता है: पहले गैर-रिक्त चरित्र के रूप में, उसके बाद एक या अधिक रिक्तियाँ, और फिर लेबल। यदि इस तरह की एक रेखा पाई जाती है, तो गोटो रिपॉजिशन, लेबल के बाद लाइन में कमांड-फाइल की भरपाई करता है और बाहर निकलता है। यह शेल को लेबल की गई रेखा पर स्थानांतरित करने का कारण बनता है।

आजकल, में bash, यह एक नो-ऑप ऑपरेटर के रूप में उपयोग किया जाता है, सफलता लौटाता है। वास्तव में, यदि आप स्रोत कोड को देखते हैं, तो आप देखेंगे कि दोनों, trueऔर नीचे :एक ही फ़ंक्शन का उपयोग करते हैं int colon_builtin()। कोई :गैर-अंतर्निहित आदेश नहीं है, और /bin/trueवास्तव में यह क्या करता है के लिए एक काफी बड़ी कमांड है।

:कहीं भी इस्तेमाल किया जा सकता trueहै, उदाहरण के लिए command_that_can_fail || true, हालांकि यह गैर-विशेषज्ञों को भ्रमित करने की संभावना है। इसके बारे में यहाँ और पढ़ें ।


3

आप इसे ifकमांड के सकारात्मक परीक्षण पर उपयोग कर सकते हैं जब आप केवल नकारात्मक पक्ष पर कुछ करना चाहते हैं। उदाहरण के लिए:

if [[ True == False ]]; then
    :
else
    echo "true <> flase"
fi

:बैश के बिना एक वाक्यविन्यास त्रुटि उत्पन्न होगी।

यह एक बड़ा उदाहरण है। आम तौर पर आप प्रारंभिक कोडिंग में इस तरह की तकनीक का उपयोग करते हैं जब आपने उस कोड सेगमेंट को अभी तक नहीं लिखा है और बस कुछ ऐसा चाहिए जो त्रुटि उत्पन्न नहीं करता है।


अच्छा जवाब, हालांकि यह पहली बार में स्पष्ट नहीं हो सकता है, कि यह परीक्षण की स्थिति के भीतर एक वास्तविक कमांड के साथ सबसे अधिक उपयोगी है, उदाहरण के लिए if pgrep firefox >/dev/null ; then : ; else echo "Firefox not running"; fiअगर फायरफॉक्स नहीं चल रहा था तो त्रुटि दिखाई देगी। दूसरे शब्दों में, जब आपको केवल कुछ करने की आवश्यकता होती है जब कमांड में कोई त्रुटि होती है। एक तरह से यह बराबर है pgrep firefox || echo "Firefox not running", हालांकि अधिक पठनीय है और अधिक आदेशों की अनुमति देता है
सर्जियो कोलोडियाज़नी

0

मैंने बस स्क्रिप्ट को गलत करने से रोकने के लिए SSH कमांड के साथ एक स्क्रिप्ट में इसका उपयोग किया।

इस मामले में, मैं यह देखना चाहता हूं कि क्या उपयोगकर्ता सर्वर के एक सेट से जुड़ सकता है। यदि कनेक्शन ठीक है, तो दूरस्थ होस्ट ठीक से प्रतिध्वनित होगा। यदि कनेक्शन विफल रहता है, तो SSH त्रुटि के साथ प्रतिक्रिया देगा। हालाँकि, मैं चाहता हूं कि मेरी स्क्रिप्ट 0 से बाहर निकले न कि विफल होने पर SSH कमांड का मूल्य। तो अनिवार्य रूप से मैं एसएसएच त्रुटि ||को शून्य आदेश के साथ ओआरजी द्वारा फंसाता हूं :। इस तरह दिखता है:

#!/bin/bash
for i in $(cat servers.txt); do
    echo -n "$i "; 
    ssh user@${i} 'echo OK' || :; 
done

इस तरह मुझे SSH से आउटपुट मिलता है लेकिन त्रुटि कोड नहीं:

....
swl06 ok
swl07 ok
swl08 Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
swl09 ok
swl10 Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
....
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.