Bash script to detect the version control system by testing command return status
If automatically checks the return code:
if (darcs show repo); then
echo "repo exists"
else
echo "repo does not exist"
fi
You could also run the command and use && (logical AND) or || (logical OR) afterwards to check if it succeeded or not:
darcs show repo && echo "repo exists"
darcs show repo || echo "repo does not exist"
Redirecting stdout
and stderr
can be done once with 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"
The first two exec
are saving the stdin
and stderr
file descriptors, the third redirects both to /dev/null
(or somewhere other if wished).
The last two exec
restore the file descriptors again.
Everything in between gets redirected to nowhere.
Append other repo checks like Gilles suggested.
As others have already mentioned, if command
tests whether command
succeeds. In fact [ … ]
is an ordinary command, which can be used outside of an if
or while
conditional although it's uncommon.
However, for this application, I would test the existence of the characteristic directories. This will be correct in more edge cases. Bash/ksh/zsh/dash version (untested):
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
Well, it's not very pretty, but it's one way to do it inline:
if darcs show repo > /dev/null 2>&1; then <do something>; fi
By definition, if tests the exit code of a command, so you don't need to do an explicit comparison, unless you want more than success or failure. There's probably a more elegant way to do this.