Makefile传递用户输入为可执行文件参数失效排查
问题原因
你的Makefile配置存在两个核心问题:
- Make默认会为每一行独立的命令启动单独的shell子进程执行:第一行
read命令读取用户输入后设置的NUM变量仅存在于第一个子shell的环境中,第二行执行可执行文件的命令运行在第二个全新的子shell里,两个进程环境完全隔离,根本无法读取到上一个进程里设置的变量值。 - Make执行命令前会优先展开所有
$开头的标识符:你写的${NUM}会被Make识别为Makefile自有变量做解析,而你从未在Make上下文中定义过NUM,解析时会直接把${NUM}替换为空字符串,最终传给shell的执行命令本身就没有携带参数。
修复方法
调整run_NumberOfSensorReadings目标的规则:
- 用行连接符
\把两条命令合并为同一逻辑行,保证两条命令在同一个shell进程中执行 - 把shell变量的引用从
${NUM}改为$${NUM},通过双美元符转义,告诉Make不要提前展开这个变量,把它留给shell解析
修正后的目标代码如下:
run_NumberOfSensorReadings: ${EXEC} @read -p "Number of Sensor Readings:" NUM; \ ./${EXEC} $${NUM}
补充:命令前的
@前缀作用是禁止该命令回显,和.SILENT全局配置效果一致,不会影响变量传递逻辑。
内容的提问来源于stack exchange,提问作者Marcellus T. Biancardi
相关产品推荐
相关产品推荐

