首页 > 解决方案 > 为什么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

解决方案


这是因为 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 文档的此页面中进行了描述。


推荐阅读