makefile - 为什么makefile中没有扩展变量?
问题描述
在我的 Makefile 我有规则:
dbrestoretable:
line=$$(zcat ${APP_ROOT}/db/${TABLE}.dump.sql.gz | head -n 1)
zcat ${APP_ROOT}/db/${TABLE}.dump.sql.gz | \
psql -h ${DB_HOST} -p ${DB_PORT} -U ${DB_USER} ${DB_NAME} -c \
"BEGIN;COPY ${TABLE}($$line) FROM STDIN WITH( FORMAT CSV, HEADER );COMMIT;" ||:
当我执行它时,我得到错误:
line=$(zcat /home/mmkeeper/maitre_d_backend/monkeyman/db/i18n.dump.sql.gz | head -n 1)
zcat /home/mmkeeper/maitre_d_backend/monkeyman/db/i18n.dump.sql.gz | \
psql -h 127.0.0.1 -p 5433 -U tucha tucha -c \
"BEGIN;COPY i18n($line) FROM STDIN WITH( FORMAT CSV, HEADER );COMMIT;" ||:
ERROR: syntax error at or near ")"
LINE 1: BEGIN;COPY i18n() FROM STDIN WITH( FORMAT CSV, HEADER );COMM...
^
为什么$$line
不展开?
解决方案
这是因为 Makefile 规则的每一行都在单独的 shell 中运行,特别是line
规则第一行中定义的变量不会保留在规则的第二行中。
试试这个:
dbrestoretable:
line=$$(zcat ${APP_ROOT}/db/${TABLE}.dump.sql.gz | head -n 1) ; \
zcat # etc.
或者如果需要:
dbrestoretable:
export line=$$(zcat ${APP_ROOT}/db/${TABLE}.dump.sql.gz | head -n 1) ; \
zcat # etc.
仅供参考,此“功能”的相关文档在GNU make 文档的此页面中进行了描述。
推荐阅读
- javascript - 奇怪的 JSON 之类的符号。这是什么语言?
- java - 在后端处理 PUT http 请求中的可选字段的最佳方法是什么
- python - 根据另一个列表的元素添加一个列表的元素
- django - 如何注释现有的查询集
- kiwi-tcms - 避免使用 Kiwi-tcms 手动编写测试用例
- javascript - 如何显示 HTML 元素的数量等于 JavaScript 数量?
- arrays - 要显示其信息的用户 ID 数组;你如何过滤代码中其他地方的那些?
- abp - 使用 AbpApplicationFactory.Create 覆盖 IConfiguration
- javascript - 通过 GupShup 发送图像
- angular - HTTP 获取请求基本身份验证?