GNU make变量在Makefile中

4
我想创建一个Makefile文件,还要包含一个简单的脚本来运行已编译的应用程序。
我有类似以下的内容:
@touch $(SCRIPT)
@echo LD_LIBRARY_PATH=$(LIB_DIR) $(APP_DIR)/$(APP) $1 $2 $3 $4 $5 $6 > $(SCRIPT)
@chmod +x $(SCRIPT)
@echo Script successfully created.

我希望在脚本中能够像$1 $2那样出现,表示脚本的命令行参数。但是由于Makefile正在使用$1 $2作为自己的变量,所以我无法实现这个功能。我该如何解决?

2个回答

11

使用双美元符号来表示文字意义中的一个 $,而不是变量扩展,并用单引号将其括起来,以防止在输出时进行进一步的 shell 扩展:

使用双美元符号来表示文字意义中的一�� $,而不是变量扩展,并用单引号将其括起来,以防止在输出时进行进一步的 shell 扩展:

@echo 'LD_LIBRARY_PATH=$(LIB_DIR) $(APP_DIR)/$(APP) $$1 $$2 $$3 $$4 $$5 $$6'

我想在 LD_LIBRARY_PATH 行前加上 #!/bin/bash,但是在 @echo '#!/bin/bash' 后面没有出现任何行。这次可能是什么问题? - JTom
你是个救命恩人。谢谢。 在我的情况下,诀窍是使用\$$i,其中“i”是我的循环中的一个变量。 - Devaroop

2

通过加倍$来转义它:

@echo LD_LIBRARY_PATH=$(LIB_DIR) $(APP_DIR)/$(APP) $$1 $$2 $$3 $$4 $$5 $$6 > $(SCRIPT)

如果您已激活了次级扩展(不用担心-您可能没有!),则需要再次加倍$,例如$$$$1

顺便说一下,@touch命令是多余的。


2
我认为回显是在子shell中运行的(特别是因为有输出重定向),因此shell也会扩展变量。像我的答案一样引用它,这对我很有效。 - Cascabel

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