bash se pergunta de comportamento de instrução

1

Eu escrevi o seguinte pedaço de script.

if [ $(tmux has -t junk) ]
then
echo zero
else
echo one
fi

Ele sempre retorna um, não importa se a sessão existe ou não. Eu chequei na linha de comando, executando a instrução tmux e, em seguida, executando $? . Ele se comporta como esperado, zero se a sessão existe e um se a sessão não existe Por que não se a instrução não está se comportando da mesma maneira. Eu tentei mudar a declaraçã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 declaração?

    
por Naai Sekar 12.04.2013 / 06:28

2 respostas

2

Conforme mencionado, if [ $(tmux has -t junk) ] expande para if [ ] , que é avaliado como falso.

Você pode 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 isso for mais adequado, como em:

! tmux has -t junk || echo OK
! tmux has -t junk && echo ERR || echo OK
etc.

Editar:

Também não que, se um comando produz saída, você pode querer redirecionar saída para o buraco negro de /dev/null como em:

 if my_cmd >/dev/null; then echo OK else; echo ERR; fi

Se o comando produzir erro textual, você poderá redirecionar o padrão erro também por:

 if my_cmd >/dev/null 2>&1; then echo OK else; echo ERR; fi

Isso, o que segue, você já deve saber bem, mas adicione um pouco mais completude.

Como mencionado: $? é a única maneira de obter o valor de retorno do programa.

Alguns programas variam 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

Por isso, pode tomar medidas adequadas sobre erros específicos.

Se você tem o MySQL instalado, você pode fazer, e. isso por perror :

for i in {0..50}; do perror $i; done
# And
for i in {1000..1050}; do perror $i; done

para ter uma ideia.

Veja também esta resposta relacionada a erros específicos do sistema operacional que também vincula ao documento Grupos Abertos Números de erros e errno.h .

Ou dê uma olhada em SQLite e seu estendidos .

    
por 12.04.2013 / 06:53
1

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 comando tmux has -t junk 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 [ ]
    
por 12.04.2013 / 06:37