成功的子 shell 命令的 Bash 测试返回 false

成功的子 shell 命令的 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,则返回零 (true) 退出状态;否则返回 1(假)。如果没有表达式,test 也返回 1 (false)。

答案1

所有这些都是等价的:

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

shell 与其他编程语言不同。它们有 2 个输出:返回值和标准输出。您将 stdout 传递给test,但 stdout 是空字符串,因为它已被重定向。

你正在寻找的是。

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

然而[ 0 ]等都[ 1 ]返回 true,因为[ … ]里面有一个单词测试该单词是否非空。所以你需要

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

或者更简单地说

vagrant --version > /dev/null

相关内容