여러 유형의 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을 모두 인쇄해야한다는 것입니다.
반환 코드를 자동으로 확인하는 경우 :
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
파일 설명자를 저장하고 세 번째는 둘 다 /dev/null
(또는 원하는 경우 다른 위치)로 리디렉션합니다. 마지막 두 exec
파일 설명자를 다시 복원합니다. 그 사이의 모든 것은 아무데도 리디렉션되지 않습니다.
Gilles가 제안한 것과 같은 다른 저장소 검사를 추가하십시오.
다른 사람들이 이미 언급했듯이 if command
는 command
의 성공 여부를 테스트합니다. 사실로 [ … ]
는 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
정의에 따라 명령의 종료 코드를 테스트하는 경우 성공 또는 실패 이상의 것을 원하지 않는 한 명시적인 비교를 수행 할 필요가 없습니다. 이 작업을 수행하는 더 우아한 방법이있을 것입니다.
또 다른 간결한 옵션은 다음과 같습니다.
[ -d .svn ] && { svn command 1; svn command 2; }