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のフラグメントのように見えます。
ファイルには2つのエラーがあります。
sed
置換コマンドは、区切り文字として_|
_を使用しますが、中央の区切り文字は_/
_です。
Makefile変数VAR
は、$(VAR)
または_$VAR
_ではなく_${VAR}
_として逆参照されます。
Makefileはシェルスクリプトではないことに注意してください。したがって、次のMakefileは完全に有効であり、端末の出力として文字列_qux world
_を生成します。
_VAR= qux
build:
@echo 'hello world' | sed 's|hello|$(VAR)|'
_
Unix Makefileでは、_$VAR
_は変数V
の値に展開され、その後に文字AR
が続きます。これは、特に明記されていない限り、変数の名前が1文字であるためです。複数文字の変数名がある場合は、名前全体を$(...)
または_${...}
_で囲む必要があります。
明らかに、Plan9Makefileはその点で異なる場合があります。
更新:
次のmkfile
は、mk
2.0、_hello = qux
_を使用するときに正しい値を出力します。
_VAR=qux
all:
echo "hello = bar" | sed "s/= bar/= $VAR/"
_
したがって、質問の引用は私には正しいようです。