if [ $(command) ]; then ...
总是等同于
if command; then ...
但是,我得到了a couple of counter examples:
$ [ $(true) ] && echo "yes" || echo "no"
no
$ if true; then echo "yes"; else echo "no"; fi
yes
和
$ if echo "$xxxx"; then echo "yes"; else echo "no"; fi
yes
$ [ $(echo "$xxx") ] && echo "yes" || echo "no"
no
在这两种情况下,问题在于true
和echo $xxxx
(未设置变量)不返回任何内容,因此[ ]
的计算结果为False(by definition in man test
),而{{{} 1}}成功,因此其返回码为0,因此echo $xxxx
条件的计算结果为True。
但是,我想知道:我们什么时候可以假设这两项检查都是等价的?在大多数情况下,这是假设的还是可靠的?
答案 0 :(得分:4)
我会说,它们等于非等同于很少。 if
检查执行的命令的返回码(0表示成功/ true,其他任何失败/ false),并且在stdout上生成的输出之间不一定存在任何关联(这是{{ 1}}查找)和0返回代码。
答案 1 :(得分:4)
这两个陈述完全不同。当你写
if command; then ...
您正在测试命令的退出代码。如果为零,则执行该块。另一方面,当你写
if [ $(command) ]; then ...
您实际上是在测试命令的输出,而不是退出代码。
您链接的示例有效的原因是因为grep只有在找到匹配项时才会打印到标准输出。