如何转义 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
}
无需额外报价。
我在 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
}
无需额外报价。