কিছু কমান্ডের নির্দিষ্ট পরামিতি ট্র্যাক করুন


10

ধরা যাক যে আমার কাছে একটি কমান্ড রয়েছে git branch(উদাহরণস্বরূপ সর্বদা দুটি শব্দ সহ)।

আমি যা চাই তা হ'ল কমান্ডটি কখন আর্গুমেন্ট দিয়ে কার্যকর করা হয় তা ট্র্যাক করা। উদাহরণস্বরূপ, আমি যদি git branch developত্রুটি ছাড়াই কমান্ডটি চালিত করি তবে আমি developএকটি ফাইলে সঞ্চয় করতে চাই ।

আমি আমার উপর গিট কমান্ড ওভাররাইট করার চেষ্টা করেছি .bash_profile, এরকম কিছু:

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

তবে মনে হয় এটি ভাল কাজ করে না। এই কাজ করতে কোন উপায় আছে কি?


আপনার উদাহরণ অনুসারে (গিট শাখা বিকাশ) আপনি "$ #" "2" কিনা "3" নয় কিনা তা পরীক্ষা করে দেখতে চান? ... (গিট ফাংশনের 2 প্যারামিটার)
অলিভিয়ার ডুলাক

একটি ভুল ছিল, কিন্তু কোডটি একটি উদাহরণ
ঝেররান

ঠিক আছে. আমি স্টিফেনের (ভাল) উত্তরের নীচে অতিরিক্ত মন্তব্য যুক্ত করেছি। আমার মন্তব্যগুলি প্রযোজ্য নাও হতে পারে (আমি টেক্সটটিকে লগ ফাইল হিসাবে ভাবি, তবে এটিতে অন্য কোনও তারিখ থাকতে পারে না
এমনটি

উত্তর:


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গুন করা হয় ~/.bashrcযেমন লগইন bashশাঁস পড়া না ~/.bashrcডিফল্ট (ক দ্বারা bashবাগ / misfeature))। আপনি যদি সেই gitফাংশনটি রফতানি করতে না চান (তবে export -f git) আপনি যদি bashসেই স্ক্রিপ্টগুলিও চান যা gitসেই ফাংশনটি কল করার জন্য কল করে।

1
আশ্চর্যজনক ব্যাখ্যা এবং কবজির মতো কাজ করে। আপনাকে অনেক ধন্যবাদ.
ঝেরান

খুব ভাল উত্তরের জন্য +1। তবে ওপিকে [ "$#" -eq 2 ]তার উদাহরণ অনুসারে চেকটি পরিবর্তন করতে হবে । এবং তারিখটি "tacked_paraters.txt" এ যুক্ত করা ভাল ধারণা হতে পারে। আর আমি সাধারণ ক্ষেত্রে জন্য যেতে চাই (অর্থাত, শুধু 2nd পরামিতি ট্র্যাক যখন 2 পরামিতি, কিন্তু কোনো পরামিতি ট্র্যাক): আমি পরিত্রাণ পেতে চাই, এবং আছে: printf '%s: %s\n' "$(date '+%Y-%m-%dT%H:%M:%S')" "$0 $*"? (উদাহরণস্বরূপ, সমস্ত পরামিতি কমান্ডটি দেখান (নোট করুন যে আপনি এখনও কিছু তথ্য হারাচ্ছেন, উদাহরণস্বরূপ কোন প্যারামিটারের আন্ত-বিভাজক রয়েছে, যদি আছে)। আইসো 8601 স্ট্যান্ডারের নিকটে বহনযোগ্য তারিখ ))
অলিভিয়ার ডুলাক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.