在我的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
没有展开?
答案 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中介绍了此“功能”的相关文档。