如何在bitbake/yocto中转义"$"符号?

7
在Yocto中,我的一个食谱需要创建一个包含非常特定行的文件,例如:
${libdir}/something

为了实现这一点,我有一个配方任务:
do_install() {
    echo '${libdir}/something' >/path/to/my/file
}

记住我希望字符串精确地如所示,我无法弄清楚如何转义它,以防止bitbake替换为其自己的libdir值。

我最初认为使用带单引号的echo命令可以解决问题(就像在bash shell中一样),但bitbake必须在将其传递给shell之前解释该行。我还尝试过用$$\$进行转义,但都失败了。

我在bitbake文档中找不到有关防止变量扩展的内容,只有与立即、延迟和Python扩展相关的内容。

我需要做什么来使该字符串原样添加到文件中?

6个回答

7

Bitbake似乎在防止扩展方面存在特定问题。无论您使用单引号还是双引号,变量似乎都会在传递到shell之前被扩展。

因此,如果您希望它们不被扩展,您需要有效地将它们从BitBake中“隐藏”,这可以通过以下方式完成:

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

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

然而,您需要确保运行正确的echo命令。在某些发行版(如Ubuntu)下,它可能会运行sh内部的echo,该命令不识别-e选项。为了解决这个问题,您可能需要运行文件系统上存在的那个echo变体(它确实识别该选项):

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

可以使用echo、awk和printf来实现仅使用bourne shell工具的替代方法:echo "$( awk 'BEGIN{ printf "%c{libdir}/something" }, 0x24 }' )" > /path/to/my/file - PeterErnsthaft

2

据我所知,没有标准的方法可以转义这些表达式,除非尝试分解表达式 - 因此应该可以使用以下方法:

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

非常接近。不幸的是,这似乎会对任何正在使用的解析器造成问题-它确实将${prefix}放入文件中,但也会将重定向和其他函数完全相同或可能只到需要此技巧的两行中的第二行。尽管如此,从某种程度上来说,这是一个很好的起点,因为解决方案可能需要我以一种未被识别的方式(例如八进制代码)输入$。我现在会沿着这条路线继续进行。 - paxdiablo

2

默认情况下,该任务将通过 /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' 代表着追加。

这样可以消除变量扩展的问题。


1
所以,用 shell 变种没有办法做到这一点吗?我有很多其他的代码,将其转换为 Python 将会很麻烦。 - paxdiablo

1
最好的解决方案就是这样:
bitbake_function() {
    command $libdir/whatever
}

Bitbake只会扩展${libdir}$libdir会原样传递。
我们不必担心没有跟在美元符号后面的符号,而在这种情况下,无需用大括号将libdir包装起来。
仅当我们有像${foo}bar这样的东西时,才会遇到使用$foo的问题,其中需要使用大括号作为分隔符,以便bar不被包含到变量名中。在这种情况下,还有其他解决方案,例如生成shell语法"$foo"bar。这比求助于\x24更加清晰易懂。

0

0

你可以将一个变量定义为字面量美元符号。

DOLLAR = "$"

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

不需要额外的引用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接