如何转义 bitbake/yocto 中的“$”?

How do I escape a "$" in bitbake/yocto?

我在 Yocto 中的一个食谱需要创建一个包含非常特定行的文件,例如:

${libdir}/something

为此,我有食谱任务:

do_install() {
    echo '${libdir}/something' >/path/to/my/file
}

请记住,我想要那个字符串 exactly 如图所示,我不知道如何转义它以防止 bitbake 替换为它自己的值libdir.

我最初认为带单引号的 echo 命令可以解决问题(就像在 bash shell 中一样)但是 bitbake 必须解释该行 将其传递给 shell 之前。我也试过用 $$$ 转义它都无济于事。

我在 bitbake doco 中找不到任何关于防止变量扩展的内容,只是与立即、延迟和 Python 扩展有关的内容。

我需要做什么才能将该字符串按原样放入文件

默认情况下,此任务将通过 /bin/sh 作为 shell 函数执行,但这取决于您的系统,因为您可以使用名为 /bin/sh 的符号链接指向bash。尽管 BitBake 的手册阻止使用 bashism 语法。

您可以考虑将此任务作为 python 功能添加到您的食谱中:

python do_install () {
    with open('/path/to/your/file', 'a') as file:
        file.write('${libdir}/something')
}

'a'代表追加。

这应该可以解决变量扩展的问题。

据我所知,没有标准的方法来转义这些类型的表达式,除了尝试分解表达式 - 因此这应该有效:

do_install() {
    echo '$''{libdir}/something' >/path/to/my/file
}

Bitbake 似乎在阻止扩展发生方面存在特殊问题。无论您使用单引号还是双引号,似乎变量在传递给 shell.

之前都会被扩展

因此,如果你想让它们展开,你需要从BitBake中有效地隐藏它们,这是可以做到的像这样的东西:

echo -e '\x24{libdir}/something' >/path/to/my/file

这使用 $ 的十六进制版本,因此 BitBake 不会将其识别为要扩展的变量。

执行 需要确保您 运行 使用正确的 echo 命令。在某些发行版(如 Ubuntu)下,它可能 运行 sh-internal echo 无法识别 -e 选项。为了解决这个问题,您可能必须 运行 存在于文件系统上的 echo 变体(并且 确实 识别该选项):

/bin/echo -e '\x24{libdir}/something' >/path/to/my/file

如果您需要在变量赋值中使用 $,请记住 bitbake 不会评估 $whatever,因此您必须为底层 shell.

转义它

例如,我将 gcc/ld Rpath 选项设置为以这种方式使用 $ORIGIN 关键字:

TARGET_LDFLAGS_append = " -Wl,-rpath-link=\$$ORIGIN"

https://lists.yoctoproject.org/pipermail/yocto/2017-September/037820.html

最好的解决方案就是这样:

bitbake_function() {
    command $libdir/whatever
}

Bitbake 只会扩展 ${libdir}$libdir逐字传递。

我们不必担心{后面没有的美元符号,在这种情况下,libdir不需要用大括号括起来。

唯一一次我们 运行 遇到 $foo 的问题是如果我们有类似 ${foo}bar 的东西,其中需要大括号作为分隔符,这样 bar 就不是'包含在变量名中。在这种情况下,还有其他解决方案,例如生成 shell 语法 "$foo"bar。这比诉诸 \x24.

更隐秘

您可以将变量定义为文字美元符号。

DOLLAR = "$"

do_install() {
    echo '${DOLLAR}{libdir}/something' >/path/to/my/file
}

无需额外报价。