サブシェルコマンドの成功したBashテストがfalseを返す

サブシェルコマンドの成功したBashテストがfalseを返す

私はbashテスト演算子のこれらの動作をよく理解していません。私はこの行を使用してvagrantがインストールされていることを確認します。

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

これがfalse(1)を返すことがわかっているので、次のように入力する必要があります。

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

期待される結果を得るために。しかし、[ $(vagrant --version> / dev / null)]がfalse(1)を返す理由はまだ理解されていません。 True(0) を返さないでください。

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

式であるtrueを返します(そうではありませんか?)。

~からテストマニュアルページ:

テストユーティリティは式を評価し、trueと評価された場合は終了ステータス0(true)を返し、そうでない場合は1(false)を返します。式がない場合、testも1(false)を返します。

ベストアンサー1

以下はすべて同じです。

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

シェルは他のプログラミング言語とは異なります。これには、戻り値と標準出力という2つの出力があります。 stdoutをに渡していますが、teststdoutがリダイレクトされたため、空の文字列です。

あなたが探しているものです。

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

しかし、[ 0 ]背中はすべて[ 1 ]trueを返します。なぜなら、[ … ]その単語が空でないことをテストするための単語があるからです。だからあなたは必要です

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

またはもっと簡単に

vagrant --version > /dev/null

おすすめ記事