调用shell命令头时makefile挂起

时间:2019-01-03 12:00:10

标签: bash makefile

我想从我的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命令时,一切正常。我在这里做错了什么?谢谢!

2 个答案:

答案 0 :(得分:4)

请勿在食谱中使用shell make函数。食谱已经是shell脚本:

BASEDIR := $(HOME)/Downloads
MYDIR   := $(BASEDIR)/ddd

all:
    @var="$(MYDIR)/m.txt"; head -n 1 "$$var"

注意:

  • 配方在传递到shell之前先通过make进行扩展。在这里$(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})