当前位置: 首页 > news >正文

makefile中的shell变量语法总结

在 Makefile 中,变量的使用规则确实容易让人混淆,下面我来总结一下常见的几种用法及其含义:


1.$(var)${var}

  • 用途:引用 Makefile 中定义的变量。

  • 示例

    PORT = 8000 start: echo "Port is $(PORT)"
  • 说明

    • $(PORT)是 Makefile 的标准语法,用于获取变量PORT的值。
    • ${PORT}功能相同,只是另一种写法。

2.$$var

  • 用途:在 shell 命令中引用 shell 变量(避免与 Makefile 变量冲突)。

  • 示例

    start-by-uvicorn: @PORT_VAL=$${port:-9608}; \ echo "Using port: $$PORT_VAL"
  • 说明

    • $${port:-9608}是 shell 的语法,表示如果port未定义,则使用默认值9608
    • $$PORT_VAL是为了告诉 Makefile:“这不是 Makefile 变量,而是 shell 变量”,防止 Makefile 尝试解析它。

3.@符号

  • 用途:抑制命令本身的回显(即不让命令本身显示在终端中)。

  • 示例

    start: @echo "Starting application..."
  • 说明

    • 默认情况下,Makefile 会先打印执行的命令,再执行命令。
    • 加上 [@](file:///Users/liujiaqi/Desktop/code/cedongli/waf/python/waf-collect-feature/src/utils/logger.py#L0-L67) 后,只会执行命令,不会打印命令本身。

4.组合使用示例

PORT = 8000 start-by-uvicorn: @PORT_VAL=$${port:-$(PORT)}; \ echo "Using port: $$PORT_VAL"
  • 解释
    • $(PORT):引用 Makefile 中定义的PORT变量(值为8000)。
    • $${port:-$(PORT)}:shell 语法,若 [port](file:///Users/liujiaqi/Desktop/code/cedongli/waf/python/waf-collect-feature/src/config/settings.py#L60-L60) 未定义,则使用$(PORT)的值。
    • $$PORT_VAL:引用 shell 变量PORT_VAL,避免被 Makefile 解析。

总结对比表

语法类型用途
$(var)Makefile引用 Makefile 中定义的变量
$${var}ShellShell 中引用变量并支持默认值
$$varShellShell 中引用变量(避免与 Makefile 冲突)
@commandMakefile抑制命令回显

实际场景建议

  • 如果你在Makefile 规则内部需要引用 Makefile 变量,使用$(var)
  • 如果你需要在shell 命令中操作变量,使用$$var$${var}
  • 如果你不希望命令本身显示在终端中,加上 [@](file:///Users/liujiaqi/Desktop/code/cedongli/waf/python/waf-collect-feature/src/utils/logger.py#L0-L67)。
http://www.jsqmd.com/news/367703/

相关文章:

  • BISHI35 【模板】巴什博弈
  • 计算机Java毕设实战-基于springboot的工厂精密设备销售管理系统的设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 带电池产品卖到欧盟:电池法规 (EU) 2023/1542 到底管你什么?先抓住这 4 件事
  • 2025 CRM 系统选型手册:六大主流CRM采购 - 供应链 - 对账全链路能力对比与深度解析
  • android compose webView js交互
  • 为什么中小厂提示工程架构师也要关注Agentic AI?这4大竞争优势太实用
  • 顶尖游资的告白:300万变4000万,靠的是这三步选股法
  • 《GraphQL 强类型架构下的错误处理体系设计指南》
  • 怎么掌握 SEO 的全部基础?
  • 【优化部署】基于粒子群算法PSO异构节点智能部署策略(延长无线传感器网络寿命)附Matlab代码
  • 《面向第三方的GraphQL开放平台设计指南》
  • 【YOLOv8多模态涨点改进】独家创新首发 | TGRS 2025 | 引入CDFIM跨模态差异特征交互模块,通过差异特征提取和融合增强机制,减少了冗余信息,显著提升了小目标的检测精度,高效涨点改进
  • P12085 [蓝桥杯 2023 省 B] 整数删除
  • 计算机毕业设计springboot基于房屋租赁系统 SpringBoot框架下在线房产租赁服务平台的设计与实现 基于Java Web的智能住房租赁管理系统构建
  • 人工智能需要学习哪些课程?
  • 大数据存储方案:社交网络图数据库选型指南
  • 请举例 AST 的更多真实例子
  • 计算机毕业设计springboot程序设计竞赛团队管理系统 基于SpringBoot的ACM程序设计竞赛战队协同平台 Java技术栈下的算法竞赛队伍全流程管理系统
  • 数据标注:推动大数据领域进步的关键力量
  • Java毕设项目推荐-基于springboot+vue的工厂精密设备销售管理系统的设计与实现【附源码+文档,调试定制服务】
  • 基于VUE+Tailwind CSS的高德地图导航功能开发实战教程
  • 大模型微调内存优化全攻略:无需昂贵显卡,打造你的AI助手
  • 如何进行 OTel : OpenTelemetry 采用蓝图
  • Code vs Serialized AST Inputs for LLM-Based CodeSummarization: An Empirical Study
  • 【无人机三维路径规划】基于蚁群算法ACA、Astar和遗传GA算法实现无人机山地路径规划附matlab代码
  • 收藏备用|2026年AI人才市场真相:缺口500万+,程序员吃透这篇少走3年弯路
  • 千亿美金争夺战:AI军火商为何突然“踩刹车”?Anthropic3500亿美元;OpenAI8300亿美元
  • 【MIMO通信】超越对角线RIS MIMO容量最大化Matlab复现
  • 收藏备用|AI Agent薪资天花板曝光(60W-300W),小白/程序员入局必看
  • 必收藏!5大主流基于图的RAG框架详解(小白程序员入门必备)