代码之家  ›  专栏  ›  技术社区  ›  Chris G.

如何在Makefile中获取父目录

  •  0
  • Chris G.  · 技术社区  · 6 年前

    这是打印当前目录,而不是父目录:

    run:
        @cd ..; \
        echo $(shell pwd)
    

    我需要一个命令中的父目录,比如:

    run:
        @cd ..; \
        docker run -it --rm -p 8080:8080 -v $(shell pwd):/go/src/hello golang bash
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   MadScientist    6 年前

    记住make通过调用一个shell并将配方发送给shell执行来工作。Make没有“内置”shell,因此它不直接运行配方。

    问题是 $(shell ..) 是一个make函数。所有make变量和函数都被扩展 之前 调用shell(考虑:shell不知道如何处理make函数)。

    这意味着make函数 $(shell ...) 首先是扩展和 pwd 是run,它为您提供make进程正在运行的当前目录,然后将生成的字符串传递给shell执行。所以贝壳看到了这一点:

    cd ..; echo /path/to/make/dir
    

    你不需要使用 $(外壳…) 功能 里面 菜谱;菜谱已经在壳里运行了!相反,您希望在配方中使用shell语法。唯一需要注意的是,你必须避开美元符号(替换外壳 $ 具有 $$ )所以make不会把它们解释为make变量。所以如果你写:

    run:
        @cd ..; echo $$(pwd)
    

    然后make展开该字符串并将此命令发送到shell:

    cd ..; echo $(pwd)
    

    你想怎么用就怎么用。

        2
  •  0
  •   Jens    6 年前

    为什么不使用POSIXly强制变量 PWD ?

    run:
        @cd ..; echo $$PWD
    

    立即保存进程!