Makefile创建含随机值变量失败:生成随机字符串存变量遇问题
Makefile生成随机字符串并赋值变量的正确写法
问题重现
想在Makefile的install目标里生成随机字符串并存到变量里,写了这段代码:
install: LOCALSTORAGE_ACCESS_TOKEN = echo $RANDOM | md5sum | head -c 20; echo; echo $(LOCALSTORAGE_ACCESS_TOKEN)
执行make install后出现报错:
LOCALSTORAGE_ACCESS_TOKEN = echo ANDOM | md5sum | head -c 20; echo; /bin/sh: 1: LOCALSTORAGE_ACCESS_TOKEN: not found d41d8cd98f00b204e980 echo
碰到两个问题:
LOCALSTORAGE_ACCESS_TOKEN变量根本没赋值成功$RANDOM输出异常,结果固定不变
改成$$RANDOM后还是一样报错。
问题原因
- shell变量赋值语法错误:Makefile里的shell命令中,变量赋值不能加空格(
VAR=value才是正确的shell赋值写法,代码里=前后有空格,shell会把LOCALSTORAGE_ACCESS_TOKEN当成命令执行,自然找不到)。 - 多命令跨shell进程:Makefile默认会给目标下的每一行命令单独启动一个shell进程,前一行定义的变量到下一行就失效了。
$RANDOM转义问题:$RANDOM是shell的内置变量,但在Makefile里$会被解析为Make的变量引用,所以必须写成$$RANDOM才能让shell识别。
正确写法
写法一:单行命令完成赋值+使用
把所有命令写到一行,用分号分隔,确保在同一个shell进程里执行:
install: LOCALSTORAGE_ACCESS_TOKEN=$$(echo $$RANDOM | md5sum | head -c 20); echo $$LOCALSTORAGE_ACCESS_TOKEN
这里用$$()捕获命令的输出结果赋值给变量,避免了管道直接赋值的问题,同时所有命令在同一个shell里,变量能正常读取。
写法二:用.ONESHELL:实现多行命令共享变量
如果觉得单行代码太乱,可以用GNU Make的.ONESHELL:指令,让目标下的所有命令在同一个shell进程中运行:
.ONESHELL: install: LOCALSTORAGE_ACCESS_TOKEN=$$(echo $$RANDOM | md5sum | head -c 20) echo $$LOCALSTORAGE_ACCESS_TOKEN
注意:.ONESHELL:需要GNU Make 3.82及以上版本支持。
内容的提问来源于stack exchange,提问作者sineverba
相关产品推荐
相关产品推荐

