我在Yocto中的一个食谱需要创建一个包含非常特定的行的文件,例如:
${libdir}/something
为此,我有配方任务:
do_install() {
echo '${libdir}/something' >/path/to/my/file
}
请记住,我想要完全如图所示的字符串,我无法弄清楚如何逃避它以防止bitbake
替换其自己的libdir
值。
我原本以为使用单引号的echo
命令可以解决问题(就像在bash
shell中那样)但bitbake
必须在将该行传递给shell之前解释该行。我也尝试用$$
和\$
逃避它无济于事。
我在bitbake
doco中找不到关于防止变量扩展的任何内容,只是与即时,延迟和Python扩展有关。
我需要做什么才能将该字符串原样放入文件中?
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
默认情况下,此任务将通过/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_function() {
command $libdir/whatever
}
Bitbake只会扩展${libdir}
; $libdir
通过逐字传递。
我们不必担心{
没有遵循的美元符号,在这种情况下,没有必要将libdir
包裹在括号中。
唯一一次我们遇到$foo
的问题就是如果我们有类似${foo}bar
的东西,其中大括号需要作为分隔符,以便bar
不包含在变量名中。在那种情况下,还有其他解决方案,例如生成shell语法"$foo"bar
。这比使用\x24
更不含神秘。
如果你需要在变量赋值中使用$,请记住bitbake不会评估$,因此你必须为底层shell转义它。
例如,我设置gcc / ld Rpath选项以这种方式使用$ ORIGIN关键字:
TARGET_LDFLAGS_append = " -Wl,-rpath-link=\\$$ORIGIN"
https://lists.yoctoproject.org/pipermail/yocto/2017-September/037820.html