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