为什么变量不在makefile中展开?

时间:2018-07-31 18:31:34

标签: 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没有展开?

1 个答案:

答案 0 :(得分:1)

这是因为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.

仅供参考,this page of the doc of GNU make中介绍了此“功能”的相关文档。