因此,我在 bitbake 配方中有一个 shell 函数,仅作为示例,该函数将查看配方名称并查看其中是否包含“本机”子字符串。
# foo.bb
# function is within foo.bb but outside other tasks.
is_recipe_native() {
local is_native="false"
case "${PN}" in
*native*)
is_native="true"
;;
esac
echo "${is_native}"
}
# a shell task within foo.bb
do_some_task() {
# here, shell expansion won't work, resulting in an empty string.
local is_native="$(is_recipe_native)"
bbnote "${is_native}" # logs an empty string
}
在这种情况下,is_native 的值为空字符串(“”)。不发生 shell 扩展,或者 bitbake 不知道
${is_native}
是什么。
但是,如果我这样做,就会发生 shell 扩展:
## foo.bb
## a shell task within foo.bb
do_some_task() {
## a shell function defined within the task.
is_recipe_native() {
local is_native="false"
case "${PN}" in
*native*)
is_native="true"
;;
esac
echo "${is_native}"
}
# here, shell expansion works.
local is_native="$(is_recipe_native)"
bbnote "${is_native}" # logs "true" or "false" as needed.
}
我理解这种差异是由于 run._do_some_task 脚本最终生成的方式造成的。
但是,在我正在研究的一些食谱中,到处都有一些样板文件,我想将它们合并到我可以调用的函数中(并在变量中进行插值)。
但是大量的样板文件也不能保证使用 python 的麻烦。
所以,问题是(我似乎无法在 Yocto 手册中找到答案):我可以在配方内部但在任务之外定义一个 shell 函数吗?我可以在 shell 任务中调用它通过 shell 扩展字符串?
谢谢。
您需要删除
is_native
之后的引号:
is_native=$(is_recipe_native)
解析器受到限制,不支持带引号的语法。
注意:shell 函数是用
/bin/sh
执行的,所以你应该尽量避免使用诸如 local
等 bashism。
请参阅文档:
脚本由 /bin/sh 执行,它可能不是 bash shell,但可能是 dash 之类的东西。您不应该使用 Bash 特定的脚本 (bashisms)。