bitbake 配方中的 shell 功能扩展

问题描述 投票:0回答:1

因此,我在 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 扩展字符串?

谢谢。

shell yocto bitbake yocto-recipe
1个回答
0
投票

您需要删除

is_native
之后的引号:

is_native=$(is_recipe_native)

解析器受到限制,不支持带引号的语法。


注意:shell 函数是用

/bin/sh
执行的,所以你应该尽量避免使用诸如
local
等 bashism。

请参阅文档

脚本由 /bin/sh 执行,它可能不是 bash shell,但可能是 dash 之类的东西。您不应该使用 Bash 特定的脚本 (bashisms)。

© www.soinside.com 2019 - 2024. All rights reserved.