【问题标题】:How do I escape a "$" in bitbake/yocto?如何在 bitbake/yocto 中转义“$”?
【发布时间】:2016-10-11 04:16:09
【问题描述】:

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

${libdir}/something

为此,我有食谱任务:

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

请记住,我希望该字符串 完全 如图所示,但我不知道如何对其进行转义以防止 bitbake 替换为它自己的 libdir 值。

我最初认为带有单引号的 echo 命令可以解决问题(就像它在 bash shell 中所做的那样),但 bitbake 必须在将其传递给贝壳。我也尝试过使用$$\$ 来逃避它,但无济于事。

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

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

【问题讨论】:

    标签: variables task yocto bitbake recipe


    【解决方案1】:

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

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

    【讨论】:

    • 那么,有 no 方法可以使用 shell 变体吗?我有相当多的其他代码必须转换成 Python 会很烦人。
    【解决方案2】:

    除了尝试分解表达式之外,没有标准的方法可以逃避我所知道的这些类型的表达式 - 因此这应该有效:

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

    【讨论】:

    • 非常接近。不幸的是,这似乎会对正在使用的任何解析器造成问题 - 它确实${prefix} 放入文件中,但它也将重定向和函数的其余部分逐字放入,或者可能只是第二(两)行需要这个技巧。不过,这是一个很好的起点,因为解决方案可能需要我以无法识别的方式输入$(例如八进制代码。我现在将遵循该行。
    【解决方案3】:

    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
    

    【讨论】:

    • 在 echo、awk 和 printf 的帮助下可以实现仅使用 bourne shell 实用程序的替代方案:echo "$( awk 'BEGIN{ printf "%c{libdir}/something" }, 0x24 }' )" > /path/to/my/file
    【解决方案4】:

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

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

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

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

    【讨论】:

      【解决方案5】:

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

      bitbake_function() {
          command $libdir/whatever
      }
      

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-06-10
        • 2016-06-24
        • 2018-06-26
        • 2022-11-05
        • 2018-03-14
        • 2014-10-19
        • 2020-03-12
        • 1970-01-01
        相关资源
        最近更新 更多