2016-06-10 27 views
4

我的一個Yocto食譜需要創建一個包含一個非常具體的線路文件,是這樣的:

${libdir}/something 

要做到這一點,我有祕方的任務:

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

牢記我想要的字符串正好是所示,我不知道如何逃避它,以防止bitbake從它自己的值libdir中代替。

我本來以爲用單引號會做的伎倆的echo命令(因爲它在bash殼一樣),但bitbake必須解釋線之前將它傳遞給外殼。我也試圖用$$\$逃脫它無濟於事。

我在bitbake doco中找不到任何關於防止變量擴展的內容,只是用於即時,延遲和Python擴展。

我需要做些什麼才能將字符串按原樣存入文件

回答

3

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 
+0

bourne shell實用程序可以在echo,awk和printf幫助下實現:'echo'$(awk'BEGIN {printf「%c {libdir}/something」},0x24}')「>/path/to/my/file' – PeterErnsthaft

2

默認情況下此任務將作爲外殼的功能通過/bin/sh執行,但它取決於你的系統上它會是什麼,你可以有一個名爲/bin/sh指向來砸符號鏈接。儘管BitBake的手冊阻止使用bashism語法。

你可以考慮就在你的食譜爲Python函數添加此任務:

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

'a'代表追加。

這應該消除可變擴展的問題。

+0

那麼,有沒有*方法可以使用shell變體來做到這一點?我有很多其他的代碼會被煩人的轉換成Python。 – paxdiablo

2

有逃避這些種種,我知道的表情,除了要儘量打破了表達的沒有標準的方式 - 因此這應該工作:

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

非常接近。不幸的是,這似乎會導致無論使用何種語法分析器都出現問題 - 它*會將'$ {prefix}'放入文件中,但它也會逐字放入重定向和其餘部分,或者可能直到第二個(兩條)線需要這個技巧。儘管如此,這是一個很好的指針,因爲解決方案可能需要我以無法識別的方式放入'$'(例如八進制代碼,我現在要遵循這條線) – paxdiablo

0

最好的解決辦法很簡單::

比如我這樣設置的gcc/LD RPATH選項,使用$ ORIGIN關鍵字

bitbake_function() { 
    command $libdir/whatever 
} 

BitBake的只能將就展開${libdir}; $libdir通過逐字傳遞。

我們不必擔心沒有跟隨{的美元符號,在這種情況下,無需將libdir用大括號括起來。

我們碰上只$foo問題的唯一情況是,如果我們有像${foo}bar其中括號需要作爲分隔符,這樣bar不納入變量名。在這種情況下,還有其他解決方案,例如生成shell語法"$foo"bar。這比採取\x24更加神祕。