生成文件时如何让echo显示"$PATH"字符串

62
我试图强制让make文件显示下一个字符串:
"Please execute next commands:
setenv PATH /usr/local/greenhills/mips5/linux86:$PATH"
问题出在"$PATH"上。命令行无法找到该命令。
@echo "setenv PATH /usr/local/greenhills/mips5/linux86:$PATH"

导致一个结果

"setenv PATH /usr/local/greenhills/mips5/linux86:ATH"

有任何逃逸字符、引号的组合,"$(shell echo " 没有得到所需的结果...

有什么建议吗?

3个回答

65
在GNU make手册中的value函数部分,描述了一个特定的例子:
“value”函数提供了一种方法,使您可以使用变量的值而不进行扩展。请注意,这并不会撤消已经发生的扩展;例如,如果您创建了一个简单扩展的变量,那么在定义期间其值将被扩展;在这种情况下,“value”函数将返回与直接使用变量相同的结果。
“value”函数的语法为:
 $(value variable)

需要注意的是variable是变量的名称; 不是该变量的引用。因此,在编写它时通常不会使用‘$’或括号。(但是,如果要使名称不是常数,则可以在名称中使用变量引用。)

此函数的结果是包含变量值的字符串,而不发生任何扩展。例如,在此makefile中:

 FOO = $PATH

 all:
         @echo $(FOO)
         @echo $(value FOO)

由于“$P”会被扩展为make变量,第一行输出将是ATH。而第二行输出将是你的$PATH环境变量的当前值,因为value函数避免了扩展。


谢谢您指出变量声明是在目标之外完成的。它们可以在目标内部定义吗? - kgui

29

make 使用 $ 来进行自身的变量展开。例如,单字符变量 $A 或具有长名称的变量 - ${VAR}$(VAR)

要在命令中使用 $,请使用 $$,例如:

all:
  @echo "Please execute next commands:"
  @echo 'setenv PATH /usr/local/greenhills/mips5/linux86:$$PATH'

还要注意,为了使""''(双引号和单引号)不起作用,并且它们会逐字传递给shell。(删除@符号以查看make发送到shell的内容。)为了防止shell扩展$PATH,第二行使用''


谢谢,你给了我方向!@echo "setenv PATH /usr/local/greenhills/mips5/linux86:$$PATH"。将整个$PATH打印出来的情况下,但是@echo 'setenv PATH /usr/local/greenhills/mips5/linux86:$$PATH'可以完成任务! - BaruchLi
因为,正如我所指出的,""''被传递到了shell中。在""内部,shell会展开$PATH,但在''内部不会展开。 - Dummy00001
谢谢提醒,我已经很久没有使用make了。 - Steve Weet
说实话,我总是忘记这一点,一开始也会犯同样的错误 ;) - Dummy00001

1

棘手

Makefile片段 - 如何打印和使用

CURRENTDIR =  $(shell pwd)
PARENTDIR = $(shell dirname $(CURRENTDIR))
#HOME =  $${HOME} No need of this
#PATH = $${PATH} or this

test:
    $(info  HOME is  $(value HOME) PATH is $(value PATH))
    $(info  HOME is  $(HOME) PATH is $(PATH))
    -$(shell unzip xx.zip -d $(HOME)/.local)
    $(export PATH := $(PATH):$(HOME)/.local/bin)

输出

make test

HOME is  /home/alex PATH is /home/alex/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin:/usr/lib/cuda/bin:/usr/local/go/bin
HOME is  /home/alex PATH is /home/alex/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin:/usr/lib/cuda/bin:/usr/local/go/bin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接