bash - Makefile 中的这些行是什么意思?
问题描述
我必须快速了解 Makefile,以了解我遇到的一些问题。我遇到了这些问题,我想确保我正确理解了它们的使用。
cp $< $@
sed -i -e 's#{{DEPLOY}}#https://example.com/#g' $@
说清楚,我知道sed
在这里被用来进行(全局?)字符串替换,但是 bash 特殊字符的使用使这可能比它应该的更令人困惑。
希望能解释一下上面两行实际上在做什么。
解决方案
它们是GNU Make 自动变量:
$@
规则目标的文件名。如果目标是存档成员,则“$@”是存档文件的名称。在具有多个目标的模式规则中(请参阅模式规则简介),“$@”是导致规则配方运行的目标的名称。
$<
第一个先决条件的名称。如果目标从隐式规则中获得其配方,这将是隐式规则添加的第一个先决条件(请参阅隐式规则)。
看看目标和先决条件是什么。
sed -i -e 's#{{DEPLOY}}#https://example.com/#g' $@
{{DEPLOY}}
用https://example.com/
in替换所有出现的$@
。
综上所述,一个更简单、更健壮的版本
cp $< $@
sed -i -e 's#{{DEPLOY}}#https://example.com/#g' $@
是:
sed -e 's#{{DEPLOY}}#https://example.com/#g' $< > $@
推荐阅读
- javascript - 如何修复我的代码在 javascript 中只运行一次
- spring - Spring 和 React Native - 推送通知?
- wordpress - WordPress - 添加新分类术语时“抱歉,您不能这样做”
- google-cloud-platform - GCP API 网关:无法使用路径参数
- python - keras模型的合并,输入输出问题
- ruby - Sequel Ruby 读取 bytea 数据类型
- visual-studio-code - 禁用自动换行时如何禁用 VScode 中粘贴文本的长度限制?
- hibernate - 当我使用左连接提取时,@EmbeddedId 会导致额外的选择
- bash - "${BASH_SOURCE[0]}" 和 $( cd $( dirname "xxx" && pwd ) 在 bash 脚本中的含义
- postgresql - Postgres:按特定时区的日期分组