bash if questão de comportamento da declaração

bash if questão de comportamento da declaração

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/nullem:

 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 junkmas não o valor de retorno.

Então, como está sempre imprimindo um como no primeiro caso, isso significa que o tmux has -t junkcomando 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 [ ]

informação relacionada