Sed
mk、sed 和嵌入環境變數
使用mk,GNU sed 時,我發現變數根本不會擴展。
有問題的程式碼:
VAR=qux ... build: sed -i "s|FOO = .*|FOO = $VAR|" bar.file
這似乎執行以下內容:
sed -i "s|FOO = .*|FOO = $VAR|" bar.file
當我想讓它執行時
sed -i "s|FOO = .*|FOO = qux|" bar.file
正如其他堆棧交換文章所提到的,我嘗試過使用單引號和雙引號。我可以
$VAR
擴展的唯一實例是當它周圍沒有引號時。這當然意味著sed
不再將表達式視為表達式。
事實證明,雖然我之前嘗試過轉義它,但我錯誤地在它周圍加上了雙引號,如下所示:
sed -i 's|FOO = .*|FOO = '"$VAR"'|' bar.file
將其更改為
sed -i 's|FOO = .*|FOO = '$VAR'|' bar.file
作品。
這看起來像 Makefile 中的一個片段。
文件中有兩個錯誤:
sed
替換命令|
用作分隔符,但中間分隔符是/
.- Makefile 變數
VAR
被取消引用,$VAR
而不是$(VAR)
or${VAR}
。請注意,Makefile 不是 shell 腳本。因此,以下 Makefile 完全有效,並將
qux world
在終端上生成字元串作為輸出:VAR= qux build: @echo 'hello world' | sed 's|hello|$(VAR)|'
在 Unix Makefile 中,將擴展為後跟字母
$VAR
的變數的值。這是因為除非另有說明,否則變數的名稱是單個字元。如果您有多字元變數名稱,則必須將整個名稱括在或中。V``AR``$(...)``${...}
顯然,Plan9 Makefiles 在這方面可能有所不同。
更新:
以下
mkfile
在使用mk
2.0 時輸出正確的值,hello = qux
:VAR=qux all: echo "hello = bar" | sed "s/= bar/= $VAR/"
所以問題中的引用對我來說似乎是正確的。