Tập lệnh Bash để phát hiện hệ thống kiểm soát phiên bản bằng cách kiểm tra trạng thái trả về lệnh


11

Tôi đang làm việc với một tập lệnh bash mà tôi muốn làm việc cho một số loại VCS. Tôi đang nghĩ đến việc kiểm tra nếu một thư mục là một repo cho một hệ thống bằng cách chạy một lệnh thông tin thông thường và kiểm tra mã trả về, thành công hay lỗi. Trong mã giả:

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

Tôi có thể chạy một lệnh, ví dụ darcs show repovà sử dụng $?để lấy mã trả về của nó.

Câu hỏi của tôi là: có cách nào gọn gàng để chạy và trả về số mã trả về trong một dòng không? ví dụ

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

Hay tôi phải xác định một hàm?

Một yêu cầu bổ sung là cả stderr và stdout nên được in.

Câu trả lời:


15

Nếu tự động kiểm tra mã trả về:

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

Bạn cũng có thể chạy lệnh và sử dụng && (logic AND) hoặc || (logic OR) sau đó để kiểm tra xem nó có thành công hay không:

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

Chuyển hướng stdoutstderrcó thể được thực hiện một lần vớiexec

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"

Hai cái đầu tiên execđang lưu stdinstderrmô tả tập tin, cái thứ ba chuyển hướng cả hai /dev/null(hoặc một nơi nào khác nếu muốn). Hai cuối cùng execkhôi phục lại mô tả tập tin một lần nữa. Tất cả mọi thứ ở giữa được chuyển hướng đến hư không.

Nối các kiểm tra repo khác như Gilles đề xuất.


Đẹp và sạch sẽ, tuy nhiên các phương pháp này in ra thông điệp cho người dùng. Tôi muốn kịch bản im lặng (tôi đã thêm điều này vào câu hỏi).
Niall Murphy

2
Tại sao bạn chạy chúng trong một subshell? Nó không cần thiết.
Chris Xuống

4

Như những người khác đã đề cập, if commandkiểm tra xem commandthành công. Trong thực tế [ … ]là một lệnh thông thường, có thể được sử dụng bên ngoài một ifhoặc có whileđiều kiện mặc dù nó không phổ biến.

Tuy nhiên, đối với ứng dụng này, tôi sẽ kiểm tra sự tồn tại của các thư mục đặc trưng. Điều này sẽ chính xác trong các trường hợp cạnh hơn. Phiên bản Bash / ksh / zsh / dash (chưa được kiểm tra):

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

Chà, nó không đẹp lắm, nhưng đó là một cách để thực hiện nội tuyến:

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

Theo định nghĩa, nếu kiểm tra mã thoát của lệnh, vì vậy bạn không cần thực hiện so sánh rõ ràng, trừ khi bạn muốn nhiều hơn thành công hay thất bại. Có lẽ có một cách thanh lịch hơn để làm điều này.


0

Một lựa chọn ngắn gọn khác sẽ là:

[ -d .svn ] && { svn command 1; svn command 2; } 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.