bash - wind - मीनिंग इन हिंदी तो इंग्लिश




बश में नोप[:] का उपयोग केस क्या है? (6)

मैंने बैश में नोप की खोज की (:), लेकिन कोई अच्छी जानकारी नहीं मिली। इस ऑपरेटर का सटीक उद्देश्य या उपयोग केस क्या है?

मैंने निम्नलिखित की कोशिश की और यह मेरे लिए इस तरह काम कर रहा है:

[[email protected]]$ a=11
[[email protected]]$ b=20
[[email protected]]$ c=30
[[email protected]]$ echo $a; : echo $b ; echo $c
10
30

कृपया मुझे बताएं, वास्तविक समय में इस ऑपरेटर का कोई भी उपयोग केस या किसी भी स्थान पर जहां इसका उपयोग करना अनिवार्य है।


alias तर्कों को अनदेखा करें

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

> alias alert_with_args='echo hello there'

> alias alert='echo hello there;:'

> alert_with_args blabla
hello there blabla

> alert blabla
hello there

आप इसका उपयोग करेंगे : एक आदेश प्रदान करने के लिए जो सफल होता है लेकिन कुछ भी नहीं करता है। इस उदाहरण में "verbosity" कमांड डिफ़ॉल्ट रूप से बंद कर दिया जाता है, इसे सेट करके:। 'वी' विकल्प इसे चालू करता है।

#!/bin/sh
# example
verbosity=:                         
while getopts v OPT ; do          
   case $OPT in                  
       v)        
           verbosity=/bin/realpath 
       ;;
       *)
           exit "Cancelled"
       ;;             
   esac                          
done                              

# `$verbosity` always succeeds by default, but does nothing.                              
for i in * ; do                   
  echo $i $($verbosity $i)         
done                              

$ example
   file

$ example -v
   file /home/me/file  

ऐतिहासिक कारणों के लिए यह और भी है। कोलन निर्मित : बिल्कुल true बराबर true । रिटर्न वैल्यू महत्वपूर्ण है, उदाहरण के लिए अनंत लूप में, यह true उपयोग करना पारंपरिक है:

while true; do
  echo 'Going on forever'
done

यह उपयोग करने के लिए पारंपरिक है : जब खोल वाक्यविन्यास को एक कमांड की आवश्यकता होती है लेकिन आपके पास कुछ भी करने की ज़रूरत नहीं है।

while keep_waiting; do
  : # busy-wait
done

: थॉम्पसन शैल के लिए सभी तरह से निर्मित तारीखें, यह यूनिक्स v6 में present थी। : थॉम्पसन शैल के goto स्टेटमेंट के लिए एक लेबल सूचक था। लेबल कोई भी पाठ हो सकता है, इसलिए : एक टिप्पणी संकेतक के रूप में दोगुना हो गया (यदि कोई goto comment , तो : comment प्रभावी रूप से एक टिप्पणी है)। बोर्न शेल को goto नहीं मिला लेकिन रखा गया:।

एक सामान्य मुहावरे जो उपयोग करता है : है : ${var=VALUE} , जो अनसेट होने पर var को VALUE सेट करता है और कुछ भी नहीं करता है अगर var पहले से सेट हो। यह निर्माण केवल एक परिवर्तनीय प्रतिस्थापन के रूप में मौजूद है, और इस परिवर्तनीय प्रतिस्थापन को किसी भी तरह से कमांड का हिस्सा होना चाहिए: नो-ऑप कमांड अच्छी तरह से कार्य करता है।

यह भी देखें कि कोलन बिल्टिन किस उद्देश्य से सेवा करता है?


कभी-कभी नो-ऑप क्लॉज आपके कोड को और अधिक पठनीय बना सकता है।

यह राय का विषय हो सकता है, लेकिन यहां एक उदाहरण है। मान लीजिए कि आपने एक ऐसा फ़ंक्शन बनाया है जो दो यूनिक्स पथों को ले कर काम करता है। यह एक पथ से दूसरे पथ में सीडी के लिए आवश्यक 'परिवर्तन पथ' की गणना करता है। आप अपने फ़ंक्शन पर प्रतिबंध लगाते हैं कि पथ दोनों को '/' से शुरू होना चाहिए या दोनों को नहीं होना चाहिए।

function chgpath() {
    # toC, fromC are the first characters of the argument paths.
    if [[ "$toC" == / && "$fromC" == / ]] || [[ "$toC" != / && "$fromC" != / ]]
    then
        true      # continue with function
    else
        return 1  # Skip function.
    fi

कुछ डेवलपर नो-ऑप को हटाना चाहते हैं लेकिन इसका मतलब सशर्त को अस्वीकार करना होगा:

function chgpath() {
    # toC, fromC are the first characters of the argument paths.
    if [[ "$toC" != / || "$fromC" == / ]] && [[ "$toC" == / || "$fromC" != / ]]
    then
        return 1  # Skip function.
    fi

अब मेरी राय में- यदि यह कार्य करने के लिए आप शर्तों को छोड़ना चाहते हैं तो यह स्पष्ट रूप से स्पष्ट नहीं है। नो-ऑप को खत्म करने और इसे स्पष्ट रूप से करने के लिए, आप फ़ंक्शन के बाहर-खंड को स्थानांतरित करना चाहते हैं:

    if [[ "$toC" == / && "$fromC" == / ]] || [[ "$toC" != / && "$fromC" != / ]]
    then
        cdPath=$(chgPath pathA pathB)   # (we moved the conditional outside)

यह बेहतर दिखता है, लेकिन कई बार हम ऐसा नहीं कर सकते; हम चाहते हैं कि समारोह के अंदर चेक किया जाए।

तो यह कितनी बार होता है? अक्सर नहीं। शायद साल में एक या दो बार। यह अक्सर पर्याप्त होता है, आपको इसके बारे में पता होना चाहिए। जब मैं सोचता हूं कि यह मेरे कोड की पठनीयता में सुधार करता है (भाषा के बावजूद) मैं इसका उपयोग करने से दूर नहीं हूं।


मेरा दो

पीओडी टिप्पणियां एम्बेड करें

का एक बहुत ही मजेदार आवेदन : बैश स्क्रिप्ट में पीओडी टिप्पणियों को एम्बेड करने के लिए है, ताकि मैन पेज को जल्दी से उत्पन्न किया जा सके। बेशक, एक अंततः पर्ल में पूरी लिपि को फिर से लिख देगा ;-)

रन-टाइम फ़ंक्शन बाइंडिंग

यह रन-टाइम पर बाध्यकारी कार्यों के लिए कोड पैटर्न का एक प्रकार है। फाई, केवल एक निश्चित ध्वज सेट होने पर कुछ करने के लिए एक डिबगिंग फ़ंक्शन है:

#!/bin/bash
# noop-demo.sh 
shopt -s expand_aliases

dbg=${DBG:-''}

function _log_dbg {
    echo >&2 "[DBG] [email protected]"
}

log_dbg_hook=':'

[ "$dbg" ] && log_dbg_hook='_log_dbg'

alias log_dbg=$log_dbg_hook


echo "Testing noop alias..."
log_dbg 'foo' 'bar'

आपको मिला:

$ ./noop-demo.sh 
Testing noop alias...
$ DBG=1 ./noop-demo.sh 
Testing noop alias...
[DBG] foo bar

यदि आप set- e उपयोग करते हैं तो || : || : विफलता होने पर स्क्रिप्ट से बाहर निकलने का एक शानदार तरीका नहीं है (यह स्पष्ट रूप से इसे पास करता है)।





noop