कुछ कमांड पर कुछ मापदंडों को ट्रैक करें


10

मान लीजिए कि मेरे पास एक कमांड है git branch(हमेशा कुछ शब्दों के साथ) उदाहरण के लिए।

जब मैं चाहता हूं कि जब इस आदेश को तर्कों के साथ निष्पादित किया जाए, तो इस पर नज़र रखें। उदाहरण के लिए, अगर मैं git branch developत्रुटियों के बिना कमांड निष्पादित करता हूं, तो मैं developएक फाइल पर सहेजना चाहता हूं ।

मैंने .bash_profileकुछ पर git कमांड लिखने की कोशिश की , कुछ इस तरह से:

git () {
    if [ $# -eq 3 ]
    then
        git $@
        echo $2 > /path/tacked_parameters.txt
    else
        git $@
    fi
}

लेकिन लगता है कि अच्छी तरह से काम नहीं करता है। क्या इसे करने का कोई तरीका है?


आपके उदाहरण के अनुसार (git ब्रांच विकसित) आप चेक करना चाहते हैं कि क्या "$ #" "2" है और "3" नहीं? ... (गिट फंक्शन के 2 पैरामीटर)
ओलिवियर दुलैक

एक गलती थी, लेकिन कोड सिर्फ एक उदाहरण है
jherran

ठीक। मैंने स्टीफन के (अच्छे) उत्तर के नीचे अतिरिक्त टिप्पणी जोड़ दी। मेरी टिप्पणी लागू नहीं हो सकती है (मैं एक लॉग फ़ाइल के रूप में .txt के बारे में सोचता हूं, लेकिन यह कुछ और हो सकता है जो इसमें तारीखें नहीं दे सकते हैं?)
ओलिवियर दुलैक

जवाबों:


18

आपको यहां कुछ समस्याएं मिली हैं:

  • आपका gitकार्य मूल gitआदेश के बजाय पुनरावर्ती रूप से कॉल कर रहा है ।
  • आप $@बिना किसी मतलब के उपयोग कर रहे हैं, जो भी समझ में नहीं आता है
  • आप अन्य चरों को बिना बताए छोड़ रहे हैं , शेल से उन्हें + ग्लोब को विभाजित करने के लिए कह रहे हैं।
  • आप मनमाने डेटा के लिए उपयोगecho कर रहे हैं ।
  • आप मूल gitआदेश की निकास स्थिति खो रहे हैं ।
  • आप प्रत्येक आह्वान पर अपनी लॉग फ़ाइल को अधिलेखित कर रहे हैं।
  • आप फ़ंक्शन परिभाषाएँ अपने में डाल रहे हैं ~/.bash_profileजो आपके लॉगिन सत्र को अनुकूलित करने के लिए है, न कि आपके शेल को और सामान्य रूप से गैर-लॉगिन bashइनवोकेशन द्वारा नहीं पढ़ा जाता है ।

आप कुछ इस तरह चाहते हैं:

git() {
  if [ "$#" -eq 3 ]
  then
    local ret
    command git "$@"; ret=$?
    printf '%s\n' "$2" >> /path/tacked_parameters.txt
    return "$ret"
  else
    command git "$@"
  fi
}

अर्थात्:

  • अपने चर को उद्धृत करें,
  • कमांडcommand चलाने के लिए उपयोग करें ,git
  • gitस्थानीय चर में निकलने की स्थिति को बाहर निकलने पर वापस लौटाएं,
  • लॉग फ़ाइल में पुनर्निर्देशन के >>बजाय का उपयोग करें >
  • के printfबजाय का उपयोग करें echo
  • और इसे अपने ~/.bashrcबदले में (यह सुनिश्चित करें कि आपका लॉगिन लॉगिन के रूप ~/.bash_profileमें सोर्सिंग कर रहा है डिफ़ॉल्ट रूप से नहीं पढ़ा जाता है ( बग / मिसफिट))। जब तक आप उस फ़ंक्शन (साथ ) को निर्यात नहीं करना चाहते हैं जब तक आप स्क्रिप्ट को उस फ़ंक्शन को कॉल करने के लिए कॉल करना चाहते हैं ।~/.bashrcbash~/.bashrcbashgitexport -f gitbashgit

1
अद्भुत स्पष्टीकरण और एक आकर्षण की तरह काम करता है। आपका बहुत बहुत धन्यवाद।
जहरन

बहुत अच्छे उत्तर के लिए +1। लेकिन ऑप [ "$#" -eq 2 ]को अपने उदाहरण के अनुसार चेक को बदलने की आवश्यकता हो सकती है । और यह एक अच्छा विचार हो सकता है कि "टैक्स्ड_परमेटर्स.टेक्स्ट" को भी तारीख जोड़ें। और मैं सामान्य मामले के लिए जाऊंगा (यानी, 2 मापदंडों के केवल 2 मापदंडों पर नज़र रखने के लिए नहीं, बल्कि किसी भी पैरामीटर को ट्रैक करने के लिए): अगर मुझे इससे छुटकारा मिल जाएगा, और printf '%s: %s\n' "$(date '+%Y-%m-%dT%H:%M:%S')" "$0 $*":? (यानी, आदेश + सभी मापदंडों (नोट पता चलता है कि आप अभी भी, उदाहरण के जो पैरामीटर का था इंट्रा-विभाजक के लिए कुछ जानकारी खो देते हैं, यदि कोई हो) पोर्टेबल तारीख। करीब iso8601 मानक करने के लिए)
ओलिवर Dulac
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.