在Makefile环境变量中使用美元符号

4

有没有可能在我的Makefile的某个部分中“禁用”变量扩展?

这是我遇到的问题的示例:

print_command:
    @echo '$(COMMAND)'

这是我得到的输出结果:
$ export COMMAND='My favourite shell is $SHELL'
$ make print_command
My favourite shell is HELL
$ make print_command COMMAND='Welcome to $SHELL'
Welcome to HELL

我想要的是:

$ export COMMAND='My favourite shell is $SHELL'
$ make print_command
My favourite shell is $SHELL
$ make print_command COMMAND='Welcome to $SHELL'
Welcome to $SHELL

不使用双美元符号,是否可以这样做:

$ export COMMAND='My favourite shell is $$SHELL'
$ make print_command
My favourite shell is $SHELL
$ make print_command COMMAND='Welcome to $$SHELL'
Welcome to $SHELL

简单来说,我希望将变量 COMMAND 的确切内容转发,而不会被 make 操纵。

1个回答

8

在文本中添加$$双美元符,并将其用双引号括起来。

print_command:
                @echo "$$COMMAND"

比如说,

$ export COMMAND='My favourite shell is $SHELL'; make print_command
My favourite shell is $SHELL

请查看来自GNU make页面的《如何使用变量》页面:https://www.gnu.org/software/make/manual/make.html#toc-How-to-Use-Variables
如果您添加单引号,make会直接打印该变量。例如:
print_command:
                @echo '$$COMMAND'
$ export COMMAND='My favourite shell is $SHELL'; make print_command
$COMMAND

因为在Makefile中,$具有特殊的含义,需要进行转义。如果你需要让make扩展所定义变量的值,请使用value语法,如下:

print_command:
                @echo $(value COMMAND)
$ export COMMAND='My favourite shell is $SHELL'; make print_command
My favourite shell is /bin/bash

在上述情况下,环境变量的值被扩展为/bin/bash

2
是否可以在命令行中传递它而不使用“export”(即在“make”之后但仍然没有双美元符号)?我认为不可能,因为这相当于在“Makefile”本身中定义。 - Jack Wilsdon

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