Estou trabalhando em um script bash que gostaria de trabalhar para vários tipos de VCS. Estou pensando em testar se um diretório é um repositório de um sistema, executando um comando info típico e verificando o código de retorno, sucesso ou erro. Em pseudocódigo:
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
Posso executar um comando, por exemplo darcs show repo
E use $?
para obter seu código de retorno.
Minha pergunta é: existe uma maneira simples de executar e retornar o número do código de retorno em uma linha? por exemplo
if [ 0 -eq `darcs show repo`$? ];
Ou devo definir uma função?
Um requisito adicional é que stderr e stdout devem ser impressos.
Se verifica automaticamente o código de retorno:
if (darcs show repo); then
echo "repo exists"
else
echo "repo does not exist"
fi
Você também pode executar o comando e usar && (AND lógico) ou || (OU lógico) depois para verificar se foi bem-sucedido ou não:
darcs show repo && echo "repo exists"
darcs show repo || echo "repo does not exist"
O redirecionamento de stdout
e stderr
pode ser feito uma vez com 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"
Os dois primeiros exec
estão salvando os descritores de arquivo stdin
e stderr
, o terceiro redireciona ambos para /dev/null
(ou em algum outro lugar, se desejado). Os dois últimos exec
restauram os descritores de arquivo novamente. Tudo no meio é redirecionado para lugar nenhum.
Acrescente outras verificações de repo como Gilles sugeriu.
Como outros já mencionaram, if command
testa se command
é bem-sucedido. De fato [ … ]
é um comando comum, que pode ser usado fora de um if
ou while
condicional, embora seja incomum.
No entanto, para esta aplicação, eu testaria a existência dos diretórios de características. Isso estará correto em mais casos Edge. Versão Bash/ksh/zsh/dash (não testada):
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
Bem, não é muito bonito, mas é uma maneira de fazer isso inline:
if darcs show repo > /dev/null 2>&1; then <do something>; fi
Por definição, se testa o código de saída de um comando, então você não precisa fazer uma comparação explícita, a menos que queira mais do que sucesso ou falha. Provavelmente existe uma maneira mais elegante de fazer isso.
Outra opção sucinta seria:
[ -d .svn ] && { svn command 1; svn command 2; }