我想从我的makefile
中打印一些文本文件的第一行。
这是我的东西,它似乎不起作用:
$ cat makefile
BASEDIR = ${HOME}/Downloads
MYDIR = ${BASEDIR}/ddd
all:
var=${MYDIR}/m.txt
@echo $(shell head -n 1 ${var})
# @echo $(shell head -n 1 ${MYDIR}/m.txt)
当我尝试使用make
时,它只是挂起,必须杀死它。
当我删除评论并在head
上直接使用${MYDIR}/m.txt
命令时,一切正常。我在这里做错了什么?谢谢!
答案 0 :(得分:4)
请勿在食谱中使用shell
make函数。食谱已经是shell脚本:
BASEDIR := $(HOME)/Downloads
MYDIR := $(BASEDIR)/ddd
all:
@var="$(MYDIR)/m.txt"; head -n 1 "$$var"
注意:
$(MYDIR)
将被/home/doe/Downloads/ddd/m.txt
之类的东西代替。这就是$var
不起作用的原因。除非有一个名为ar
的make变量具有非空值v
,否则它将扩展为FOO
,在这种情况下,$var
会扩展为FOOar
。 $$var
通过make扩展为$var
,即您想要的shell语法。配方的每一行都由独立的shell执行。因此,以下内容将不起作用:
all:
@var="$(MYDIR)/m.txt"
@head -n 1 "$$var"
因为外壳变量分配(var="/home/doe/Downloads/ddd/m.txt"
)和外壳变量扩展(head -n 1 "$var"
)将由两个不同的外壳执行。如果您希望每行一个shell语句,请使用行继续:
all:
@var="$(MYDIR)/m.txt"; \
head -n 1 "$$var"
或:
all:
@var="$(MYDIR)/m.txt" && \
head -n 1 "$$var"
答案 1 :(得分:1)
请勿在配方中使用变量分配。在您的命令head -n 1 ${var}
中,表达式${var}
扩展为空,因此head
等待标准输入。以下makefile应该可以工作:
BASEDIR = ${HOME}/Downloads
MYDIR = ${BASEDIR}/ddd
var=${MYDIR}/m.txt
all:
@echo $(shell head -n 1 ${var})