Teste Bash no comando subshell de sucesso retorna false

4

Eu não entendo muito bem esse comportamento do operador do bash test. Eu usei essa linha para determinar se o vagrant está instalado.

if [ $(vagrant --version > /dev/null) ]; then echo "HELLO"; fi

Agora sei que isso retorna false (1) e que você deve digitar apenas

if vagrant --version > /dev/null; then echo "HELLO"; fi

para obter o resultado esperado. Mas eu ainda não entendi porque [$ (vagrant --version > / dev / null)] retorna false (1). Não deveria retornar true (0) desde

$(vagrant --version > /dev/null)

retorna verdadeiro, que é uma expressão (não é?).

Da página do manual teste :

The test utility evaluates the expression and, if it evaluates to true, returns a zero (true) exit status; otherwise it returns 1 (false). If there is no expression, test also returns 1 (false).

    
por Mattias 07.08.2015 / 19:32

1 resposta

3

Todos estes são equivalentes:

[ $(vagrant --version > /dev/null) ]
[]
test

shells não são como outras linguagens de programação. Eles possuem 2 saídas: o valor de retorno e stdout. Você está passando o stdout para test , mas stdout é a string vazia, já que foi redirecionada.

O que você estava procurando é.

[ $(vagrant --version > /dev/null; echo $? ) ]

No entanto, [ 0 ] e [ 1 ] etc retornam true porque [ … ] com uma única palavra dentro testa se a palavra não está vazia. Então você precisa de

[ $(vagrant --version > /dev/null; echo $? ) = 0 ]

ou mais simplesmente

vagrant --version > /dev/null
    
por 07.08.2015 / 19:43

Tags