
Eu escrevi o seguinte pedaço de script bash.
if [ $(tmux has -t junk) ]
then
echo zero
else
echo one
fi
Sempre retorna um, não importa se a sessão existe ou não. Verifiquei a linha de comando executando a instrução tmux e depois executando $? . Ele se comporta conforme o esperado, zero se a sessão existir e um se a sessão não existir. Por que a instrução if não está se comportando da mesma maneira. Eu tentei mudar a instrução if como abaixo
tmux has -t junk
if [ $? -eq 0 ]
then
echo zero
else
echo one
fi
A coisa acima funciona. Então, o que há de errado com o primeiro bloco de instruções?
Responder1
Conforme mencionado, if [ $(tmux has -t junk) ]
expanda para if [ ]
qual é avaliado como falso.
Você poderia usar:
if tmux has -t junk; then
echo OK
else
echo ERR
fi
Ou se você quiser o mais curto:
tmux has -t junk || echo ERR
Ou
tmux has -t junk && echo OK || echo ERR
Você também pode negá-lo se for mais adequado, como em:
! tmux has -t junk || echo OK
! tmux has -t junk && echo ERR || echo OK
etc.
Editar:
Além disso, não é que se um comando produzir uma saída, você pode querer redirecionar essa saída para o buraco negro como /dev/null
em:
if my_cmd >/dev/null; then echo OK else; echo ERR; fi
Se o comando produzir um erro textual, você também pode querer redirecionar o erro padrão:
if my_cmd >/dev/null 2>&1; then echo OK else; echo ERR; fi
Isso, o que se segue, você já deve saber bem, mas adicione-o para ficar um pouco mais completo.
Conforme mencionado: $?
é a única maneira de obter o valor de retorno do programa.
Alguns programas variam em termos de retorno e podem ter um significado bastante explícito.
Então, por exemplo:
mycmd
ecode=$?
case "$ecode" in
0) echo "Success";;
1) echo "Operation not permitted";;
2) echo "No such file or directory";;
esac
Com isso, é possível tomar as medidas adequadas em relação a erros específicos.
Se você tiver o MySQL instalado, você pode fazer isso, por exemplo,erro:
for i in {0..50}; do perror $i; done
# And
for i in {1000..1050}; do perror $i; done
para ter uma ideia disso.
Veja tambémesta respostarelacionado a erros específicos do sistema operacional que também vincula ao documento Open GroupsNúmeros de erroeerrno.h.
Ou dê uma olhadaSQLitee os seusestendidos.
Responder2
Quando você usa:
if [ $(tmux has -t junk) ]
Isso verifica a saída do comando, tmux has -t junk
mas não o valor de retorno.
Então, como está sempre imprimindo um como no primeiro caso, isso significa que o tmux has -t junk
comando não está imprimindo nada na saída padrão.
Então, no primeiro caso,
if [ $(tmux has -t junk) ]
está sendo avaliado como
if [ ]