在 Yocto shell 代码中出现“错误替换”错误
Posted
技术标签:
【中文标题】在 Yocto shell 代码中出现“错误替换”错误【英文标题】:Getting 'bad substitution' error in Yocto shell code 【发布时间】:2022-01-14 10:51:03 【问题描述】:我的食谱中有以下 shell 代码
VARIABLE_dev = "dev value"
VARIABLE_prod = "prod value"
do_compile()
variant="dev"
echo $VARIABLE_$variant
因此,我总是收到“错误替换”错误
/home/dev/testproj/tmp/work/machine-poky-linux-gnueabi/test-app/1.0-raspberrypi-r0/temp/run.do_compile.253: 121: Bad substitution
如果 'variant' 变量被定义为数据存储变量(在 shell 代码范围之外),那么它可以正常工作。但是在我粘贴的代码中,我总是出错。 知道这里有什么解决方案吗?
【问题讨论】:
【参考方案1】:您使用的条件变量扩展语法需要OVERRIDES
变量,您可以查看详细信息here。
但是你提供的例子不正确,不能使用。
OVERRIDES 的原理就是当你想根据某个键有条件地覆盖一个变量时。
但是,我会建议更适合您的情况,即Variable Flags
。
这是一个例子:
VARIABLE[dev] = "dev value"
VARIABLE[prod] = "prod value"
现在,如果您使用基于 Shell 的任务,则可以使用 Python 扩展:
do_compile()
bbwarn $@d.getVarFlags("VARIABLE").get('dev')
这应该显示值为“dev value”的警告
然后您可以使用另一个变量使其更具条件性,例如:
PROJECT_TYPE = "dev"
do_compile()
bbwarn $@d.getVarFlags("VARIABLE").get(d.getVar('PROJECT_TYPE'))
您可以直接使用 python 任务以获得更灵活的 python 语法。
建议:使用logging.bbclass
实用程序制作日志:
Shell:bbinfo、bbwarn、bberror、...
Python:bb.info、bb.warn、bb.error、...
更新: 使用 shell for 循环遍历标志:
flags="$@''.join(' ' + flag for flag, _ in d.getVarFlags('PACKAGECONFIG').items())"
for flag in $flags; do
bbwarn "$flag"
done
【讨论】:
我喜欢你提出的方法,但它仍然不符合我的需要。我想将 PROJECT_TYPE 条件变量引用为 shell 变量而不是数据存储,例如:for project_type in "dev prod"; do bbwarn $@d.getVarFlags("VARIABLE").get($project_type) done
如何使这个示例正常工作?
我确实设法使用 shell for 循环遍历了标志,但我没有设法使用 shell 变量从 python 调用中获取标志的值。查看我的更新。以上是关于在 Yocto shell 代码中出现“错误替换”错误的主要内容,如果未能解决你的问题,请参考以下文章
如何更改Yocto dora bitbake系统中的root密码?