কমান্ড রিটার্নের স্থিতি পরীক্ষা করে সংস্করণ নিয়ন্ত্রণ সিস্টেম সনাক্ত করতে স্ক্রিপ্টটি বাশ করুন


11

আমি বাশ স্ক্রিপ্টে কাজ করছি যা আমি বেশ কয়েকটি ধরণের ভিসিএসের জন্য কাজ করতে চাই। আমি সাধারণ তথ্য কমান্ড চালিয়ে এবং রিটার্ন কোড, সাফল্য বা ত্রুটি পরীক্ষা করে কোনও ডিরেক্টরি যদি কোনও সিস্টেমের জন্য রেপো হয় তা পরীক্ষা করার কথা ভাবছি। সিউডো কোডে:

if a svn command succeded;
    Then run svn commands
elif a darcs command succeded;
    Then run darcs commands
elif a mercurial command succeded;
    then run hg commands
else 
    something else
fi

আমি একটি কমান্ড চালাতে পারি, উদাহরণস্বরূপ darcs show repoএবং $?এর রিটার্ন কোড পেতে ব্যবহার করতে পারি।

আমার প্রশ্ন হ'ল: এক লাইনে রিটার্ন কোড নম্বরটি চালানো এবং ফেরত দেওয়ার জন্য কি ঝরঝরে উপায় আছে? উদাহরণ স্বরূপ

if [ 0 -eq `darcs show repo`$? ]; 

বা আমি একটি ফাংশন সংজ্ঞায়িত করতে হবে?

একটি অতিরিক্ত প্রয়োজনীয়তা হ'ল স্ট্ডার এবং স্টডআউট উভয়ই মুদ্রিত করা উচিত।

উত্তর:


15

যদি স্বয়ংক্রিয়ভাবে রিটার্ন কোডটি পরীক্ষা করে:

if (darcs show repo); then
  echo "repo exists"
else
  echo "repo does not exist"
fi

আপনি কমান্ডটি চালাতে পারেন এবং && (লজিক্যাল এ্যান্ড) বা || ব্যবহার করতে পারেন (লজিকাল ওআর) পরে এটি সফল হয়েছে কিনা তা পরীক্ষা করে দেখুন:

darcs show repo && echo "repo exists"
darcs show repo || echo "repo does not exist"

পুনঃনির্দেশ stdoutএবং stderrএকবার দিয়ে করা যেতে পারেexec

exec 6>&1
exec 7>&2
exec >/dev/null 2>&1

if (darcs show repo); then
  repo="darcs"
elif (test -d .git); then
  repo="git"
fi

# The user won't see this
echo "You can't see my $repo"

exec 1>&6 6>&-
exec 2>&7 7>&-

# The user will see this
echo "You have $repo installed"

প্রথম দুটি ফাইল এবং ফাইল বর্ণনাকারী execসংরক্ষণ করছে , তৃতীয়টি উভয়কে (বা অন্যথায় ইচ্ছা করলে) পুনঃনির্দেশ করে । শেষ দুটি ফাইল বর্ণনাকারী পুনরুদ্ধার করে। এর মধ্যে থাকা সমস্ত কিছুই আর কোথাও পুনঃনির্দেশিত হয়।stdinstderr/dev/nullexec

গিলিসের পরামর্শ মতো অন্যান্য রেপো চেক যুক্ত করুন।


সুন্দর এবং পরিষ্কার, তবে এই পদ্ধতিগুলি ব্যবহারকারীর জন্য বার্তা প্রিন্ট করে। আমি স্ক্রিপ্টটি চুপ করে থাকতে পছন্দ করব (আমি এটি প্রশ্নের সাথে যুক্ত করেছি)।
নিলাল মারফি

2
এগুলি কেন আপনি একটি সাব-শেলের মধ্যে চালাচ্ছেন? এটি অপ্রয়োজনীয়।
ক্রিস ডাউন

4

যেমন অন্যরা ইতিমধ্যে উল্লেখ করেছেন, সফল হয় if commandকিনা তা পরীক্ষা করে command। আসলে [ … ]এটি একটি সাধারণ কমান্ড, যা কোনও শর্তাধীন ifবা whileশর্তসাপেক্ষের বাইরে ব্যবহার করা যেতে পারে যদিও এটি অস্বাভাবিক।

যাইহোক, এই অ্যাপ্লিকেশনটির জন্য, আমি বৈশিষ্ট্যযুক্ত ডিরেক্টরিগুলির অস্তিত্ব পরীক্ষা করব। আরও প্রান্ত ক্ষেত্রে এটি সঠিক হবে। বাশ / কেএসএ / জেডএস / ড্যাশ সংস্করণ (অনির্ধারিত):

vc=
if [ -d .svn ]; then
  vc=svn
elif [ -d CVS ]; then
  vc=cvs
else
  d=$(pwd -P)
  while [ -n "$d" ]; do
    if [ -d "$d/.bzr" ]; then
      vc=bzr
    elif [ -d "$d/_darcs" ]; then
      vc=darcs
    elif [ -d "$d/.git" ]; then
      vc=git
    elif [ -d "$d/.hg" ]; then
      vc=hg
    fi
    if [ -n "$vc" ]; then break; fi
    d=${d%/*}
  done
fi
if [ -z "$vc" ]; then
  echo 1>&2 "This directory does not seem to be under version control."
  exit 2
fi

2

ভাল, এটি খুব সুন্দর নয়, তবে এটি ইনলাইন করার এক উপায়:

if darcs show repo > /dev/null 2>&1; then <do something>; fi

সংজ্ঞা অনুসারে, যদি কোনও কমান্ডের প্রস্থান কোড পরীক্ষা করে, সুতরাং আপনার সাফল্য বা ব্যর্থতার চেয়ে বেশি না চাইলে আপনাকে একটি সুস্পষ্ট তুলনা করার দরকার নেই। এটি করার জন্য আরও একটি মার্জিত উপায় আছে।


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.