web-dev-qa-db-ja.com

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が式を式として認識しなくなったことを意味します。

1
Finn O'leary

以前にエスケープを試みましたが、次のように誤って二重引用符で囲んでいることがわかりました。

sed -i 's|FOO = .*|FOO = '"$VAR"'|' bar.file

に変更する

sed -i 's|FOO = .*|FOO = '$VAR'|' bar.file

動作します。

0
Finn O'leary

これは、Makefileのフラグメントのように見えます。

ファイルには2つのエラーがあります。

  1. sed置換コマンドは、区切り文字として_|_を使用しますが、中央の区切り文字は_/_です。

  2. 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/"
_

したがって、質問の引用は私には正しいようです。

2
Kusalananda