it-swarm-ko.tech

명령 반환 상태를 테스트하여 버전 제어 시스템을 감지하는 Bash 스크립트

여러 유형의 VCS에서 작업하고 싶은 bash 스크립트를 작업 중입니다. 일반적인 info 명령을 실행하고 반환 코드, 성공 또는 오류를 확인하여 디렉토리가 시스템의 저장소인지 테스트하려고합니다. 의사 코드에서 :

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을 모두 인쇄해야한다는 것입니다.

11
Niall Murphy

반환 코드를 자동으로 확인하는 경우 :

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"

stdoutstderr 리디렉션은 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"

처음 두 execstdinstderr 파일 설명자를 저장하고 세 번째는 둘 다 /dev/null (또는 원하는 경우 다른 위치)로 리디렉션합니다. 마지막 두 exec 파일 설명자를 다시 복원합니다. 그 사이의 모든 것은 아무데도 리디렉션되지 않습니다.

Gilles가 제안한 것과 같은 다른 저장소 검사를 추가하십시오.

15
wag

다른 사람들이 이미 언급했듯이 if commandcommand의 성공 여부를 테스트합니다. 사실로 [ … ]if 또는 while 조건부 외부에서 사용할 수있는 일반적인 명령입니다.

그러나이 응용 프로그램의 경우 특성 디렉터리의 존재를 테스트합니다. 이것은 더 많은 Edge 사례에서 정확할 것입니다. 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

글쎄요, 그다지 예쁘지는 않지만 인라인으로하는 한 가지 방법입니다.

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

정의에 따라 명령의 종료 코드를 테스트하는 경우 성공 또는 실패 이상의 것을 원하지 않는 한 명시적인 비교를 수행 할 필요가 없습니다. 이 작업을 수행하는 더 우아한 방법이있을 것입니다.

2
SethG

또 다른 간결한 옵션은 다음과 같습니다.

[ -d .svn ] && { svn command 1; svn command 2; } 
0
Mihai Rotaru