कमांड रिटर्न स्थिति का परीक्षण करके संस्करण नियंत्रण प्रणाली का पता लगाने के लिए बैश स्क्रिप्ट


11

मैं एक bash स्क्रिप्ट पर काम कर रहा हूं जिसे मैं कई तरह के VCS के लिए काम करना चाहूंगा। यदि कोई निर्देशिका किसी विशिष्ट जानकारी कमांड को चलाकर और रिटर्न कोड, सफलता या त्रुटि की जांच करके सिस्टम के लिए रेपो है, तो मैं परीक्षण के बारे में सोच रहा हूं। छद्म कोड में:

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`$? ]; 

या क्या मुझे किसी फ़ंक्शन को परिभाषित करना है?

एक अतिरिक्त आवश्यकता यह है कि stderr और stdout दोनों को मुद्रित किया जाना चाहिए।

जवाबों:


15

यदि स्वचालित रूप से रिटर्न कोड की जाँच करता है:

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

आप कमांड भी चला सकते हैं और && (तार्किक और) या का उपयोग कर सकते हैं || (तार्किक OR) बाद में जाँच करें कि यह सफल हुआ या नहीं:

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को बचाने stdinऔर stderrफ़ाइल डिस्क्रिप्टर, तीसरे को पुनर्निर्देशित किया जाता है /dev/null(या यदि इच्छा हो तो कहीं और)। अंतिम दो execफिर से फ़ाइल विवरणकों को पुनर्स्थापित करते हैं। बीच में सब कुछ कहीं नहीं पुनर्निर्देशित हो जाता है।

सुझाए गए अन्य रेपो चेक जैसे गिल्स का सुझाव दें।


अच्छा और साफ, हालांकि ये तरीके उपयोगकर्ता को संदेश प्रिंट करते हैं। मैं स्क्रिप्ट को चुप रहना पसंद करूंगा (मैंने इसे प्रश्न में जोड़ा है)।
निल मर्फी

2
आप इन सब को एक सबहेल में क्यों चला रहे हैं? यह अनावश्यक है।
क्रिस डाउन

4

जैसा कि दूसरों ने पहले ही उल्लेख किया है if commandकि क्या परीक्षण commandसफल होता है। वास्तव में [ … ]यह एक सामान्य आदेश है, जिसका उपयोग एक ifया whileसशर्त के बाहर किया जा सकता है, हालांकि यह असामान्य नहीं है।

हालाँकि, इस आवेदन के लिए, मैं विशेषता निर्देशिकाओं के अस्तित्व का परीक्षण करूँगा। अधिक बढ़त के मामलों में यह सही होगा। बैश / ksh / zsh / डैश संस्करण (अप्रकाशित):

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

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


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.