Yocto中的"sh ::未知操作数"

geo*_*ory 2 shell 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
Run Code Online (Sandbox Code Playgroud)

在Ubuntu中,最后一行不返回任何内容(如预期的那样).任何想法为什么它在Yocto中抛出错误?

Eri*_*ouf 10

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

[[ "$(echo "$y")" != '' ]] && echo true
Run Code Online (Sandbox Code Playgroud)

虽然使用printf可能使用echo更好,所以你可以这样做

[[ "$(printf '%s' "$y")" != '' ]] && echo true
Run Code Online (Sandbox Code Playgroud)

以防万一$y最终可能会出现可能绊倒echo或类似的特殊字符


jil*_*les 7

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

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