mk、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不再将表达式视为表达式。

答案1

这看起来像 Makefile 中的一个片段。

文件中有两个错误:

  1. 替换命令sed使用|作为分隔符,但中间分隔符是/

  2. 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 在这方面可能有所不同。


更新:

使用2.0 时,以下mkfile输出正确的值:mkhello = qux

VAR=qux

all:
        echo "hello = bar" | sed "s/= bar/= $VAR/"

所以问题中的引用对我来说似乎是正确的。

答案2

事实证明,虽然我之前尝试过转义它,但我错误地在它周围加上了双引号,如下所示:

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

将其更改为

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

作品。

相关内容