makefile - 为什么 makefile 的行为不像配方中的 shell 脚本?
问题描述
我发现 makefile 非常有用,每个配方的标题
<target> : [dependencies]
很有帮助。在配方中,前缀 @ 和 - 以及自动定义的变量(如 $@ 和 $?)很有用。然而,除此之外,我发现编写实际食谱的方式很奇怪而且没有帮助。StackOverflow 上有很多关于“如何在 makefile 中执行此操作”的问题,这些问题在 bash 中很简单(或至少更熟悉)。
配方内容不只是解释为常规 shell 脚本有什么原因吗?阅读手册页,似乎有许多工具具有与 shell 脚本等效的功能,但语法不同。我最终指定 .ONESHELL 并用 $$ 转义 $,或者有时当我不知道如何使它在 makefile 中工作时,我只是从配方中调用一个脚本。我的问题是这是否只是不幸的设计,还是 makefile 的重要特性迫使它们以这种方式设计?
解决方案
我真的不知道如何回答你的问题。可能这意味着它并不适合 StackOverflow。
使用$$
而不是的要求$
是显而易见的。为 makefile 的每个逻辑行使用单独的 shell 而不是将整个配方传递给单个 shell 的原因不太清楚。它可以以任何一种方式工作,这就是它被选择的方式。
它现在的工作方式有一个优势,尽管也许大多数人并不关心它:如果你使用反斜杠换行符继续每一行,你只需要用 TAB 缩进第一行食谱。如果你不使用反斜杠换行符,那么每一行都必须用 TAB 缩进,否则你不知道配方在哪里结束。
如果您的问题是,Stuart Feldman 是否可以做出非常不同的语法决定,从而更容易在 makefile 中编写长/复杂的配方,那么可以肯定。选择一个比$
变量引入器更晦涩的字符会减少转义的数量(尽管 shell 脚本在某处使用了几乎每个特殊字符,所以“减少”是你能做的最好的)。为菜谱选择一个明确的“开始/停止”字符序列将使编写长菜谱更容易,但可能会牺牲一些可读性。
但事实并非如此。
推荐阅读
- php - 如何使用 MAMP 5.1 启用通用 PHP 日志和 apache 请求日志
- python-3.x - 如何检查用户名是否存在于 cgi 脚本中的数据库中?
- html - 尝试在 Mac 上使用 Unix 从 HTML 文档中的一行中提取版本号
- sql-server - 如何为生产数据库生成脚本?
- python - 提高图像处理的准确性以计数真菌孢子
- javascript - 过滤角度json 7
- android - 如何在osmdroid中将指南针调整为地图
- c++ - 不允许使用抽象类数组
- java - Hibernate Many-to-Many with join 需要时间来获取所有数据
- python - 如何调用表达式并为其赋值