Bash script เพื่อตรวจหาระบบควบคุมเวอร์ชันโดยการทดสอบสถานะการส่งคืนคำสั่ง


11

ฉันกำลังทำงานกับสคริปต์ทุบตีที่ฉันต้องการทำงานกับ VCS หลายประเภท ฉันคิดว่าการทดสอบว่าไดเรกทอรีเป็น repo สำหรับระบบโดยใช้คำสั่งข้อมูลทั่วไปและตรวจสอบรหัสส่งคืนสำเร็จหรือข้อผิดพลาด ในรหัสหลอก:

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

คุณสามารถเรียกใช้คำสั่งและใช้ && (ตรรกะ AND) หรือ || (ตรรกะ 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ไฟล์ descriptors ส่วนที่สามจะเปลี่ยนเส้นทางไปยัง/dev/null(หรืออื่น ๆ หากต้องการ) สองexecไฟล์สุดท้ายจะเรียกคืน descriptor ไฟล์อีกครั้ง ทุกสิ่งในระหว่างนั้นจะถูกเปลี่ยนเส้นทางไปยังที่อื่น

ผนวกการตรวจสอบธุรกรรมซื้อคืนอื่น ๆ ตามที่ Gilles แนะนำ


ดีและสะอาดอย่างไรก็ตามวิธีการเหล่านี้พิมพ์ข้อความถึงผู้ใช้ ฉันต้องการให้สคริปต์เงียบ (ฉันได้เพิ่มสิ่งนี้ลงในคำถาม)
Niall Murphy

2
เหตุใดคุณจึงเรียกใช้สิ่งเหล่านี้ในเชลล์ย่อย มันไม่จำเป็น
Chris Down

4

ตามที่คนอื่น ๆ พูดถึงแล้วif commandการทดสอบว่าcommandสำเร็จหรือไม่ ในความ[ … ]เป็นจริงเป็นคำสั่งทั่วไปซึ่งสามารถใช้นอกifหรือตามwhileเงื่อนไขแม้ว่าจะผิดปกติ

อย่างไรก็ตามสำหรับแอปพลิเคชันนี้ฉันจะทดสอบการมีอยู่ของไดเรกทอรีคุณสมบัติ สิ่งนี้จะถูกต้องในกรณีขอบเพิ่มเติม รุ่น Bash / ksh / zsh / dash (ยังไม่ทดลอง):

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.