"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 中使用 [[
。使用 [
并引用所有命令替换和参数扩展。
以下在 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 中使用 [[
。使用 [
并引用所有命令替换和参数扩展。