"sh: : unknown operand" 在 Yocto

"sh: : unknown operand" in Yocto

以下在 Ubuntu 中有效,但在 Yocto (Poky) 中无效。

root@system:~/# x='abc'
root@system:~/# y=''
root@system:~/# [[ $(echo $x) != '' ]] && echo true
true
root@system:~/# [[ $(echo $y) != '' ]] && echo true
sh: : unknown operand

在 Ubuntu 最后一行 returns 什么都没有(如预期的那样)。知道为什么它会在 Yocto 中抛出错误吗?

问题似乎是 $(echo $y) 正在扩展为一个空字符串,然后 [[ 没有正确处理它。解决方案是引用命令替换,如

[[ "$(echo "$y")" != '' ]] && echo true

尽管使用 printf than echo 可能更好,所以您可以像

[[ "$(printf '%s' "$y")" != '' ]] && echo true

以防万一 $y 可能会出现特殊字符,这些字符可能会导致 echo 或类似的

显然,busybox ash 有一个相当简单的 [[ 实现。它与 [ 相同,只是它需要一个 ]] 而不是 ] 最终参数。这忽略了 [[ 为什么有用的要点:[[ 应该是一个具有特殊解析的关键字,使用它看起来更漂亮并且避免了各种陷阱(同时添加了一些自己的陷阱)。我猜他们在 busybox ash 上添加了一些 bash 脚本 运行 未修改。

为了避免混淆,我建议根本不要在 busybox 中使用 [[。使用 [ 并引用所有命令替换和参数扩展。