여러 유형의 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이 모두 인쇄되어야 한다는 것입니다.
답변1
반환 코드가 자동으로 확인되는 경우:
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
파일 설명자를 다시 복원합니다. 그 사이의 모든 내용은 모든 곳으로 리디렉션됩니다.
Giles가 제안한 것과 같은 다른 저장소 검사를 첨부하세요.
답변2
다른 사람들이 이미 언급했듯이 if command
테스트는 command
성공적이었습니다. 흔하지는 않지만 실제로 or 조건 외부에서 사용할 [ … ]
수 있는 일반적인 명령입니다 .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
답변3
글쎄, 그다지 예쁘지는 않지만 인라인으로 수행하는 한 가지 방법입니다.
if darcs show repo > /dev/null 2>&1; then <do something>; fi
정의에 따라 명령의 종료 코드를 테스트하는 경우 성공이나 실패 이상의 것을 원하지 않는 한 명시적인 비교를 수행할 필요가 없습니다. 이를 수행하는 더 우아한 방법이 있을 수 있습니다.
답변4
또 다른 깔끔한 옵션은 다음과 같습니다.
[ -d .svn ] && { svn command 1; svn command 2; }