bash:PWD和CURDIR有什么区别?

Ada*_*tan 6 makefile working-directory pwd

我的问题

我使用Makefile来运行docker run目标,它需要当前工作目录作为其参数之一.

我使用$(PWD)或者$(CURDIR):

build: Dockerfile
        docker run ... <$(PWD) or $(CURDIR)>
Run Code Online (Sandbox Code Playgroud)

它们似乎产生了相同的价值.我不知道是否有一个微妙的差异,以后可以咬我,所以我想知道每个的确切定义.

我试过了什么

  • STFW
  • man make

我的问题

$(PWD)$(CURDIR)Makefile 之间有什么区别?

Ada*_*tan 10

TL; DR

使用CURDIR.

为什么?

首先,感谢雷诺Pacalet他的评论.

CURDIR

引用GNU制作手册:

CURDIR

设置为当前工作目录的绝对路径名.

为方便起见,当GNU make启动时(在处理完任何-C选项之后),它将变量CURDIR设置为当前工作目录的路径名.make永远不会触及此值:特别注意,如果包含其他目录中的文件,则CURDIR的值不会更改.如果在makefile中设置了该值,则该值具有相同的优先级(默认情况下,环境变量CURDIR不会覆盖此值).请注意,设置此变量对make的操作没有影响(例如,它不会导致make更改其工作目录).

PWD

PWD在制作手册中没有参考.很快env | grep PWD发现它是由环境设置的(在我的例子中是zsh).GNU关于特殊Shell变量的 说明指出:

PWD

Posix 1003.1-2001要求cd和pwd必须更新PWD环境变量以指向当前目录的逻辑名称,但传统shell不支持此操作.如果一个shell实例维护PWD但是一个子公司并且不同的shell不知道PWD并执行cd,这可能会引起混淆; 在这种情况下,PWD指向错误的目录.使用``pwd ' rather than$ PWD'.

由于CURDIR是保证在工作MakePWD 可能会从外壳继承,前者应该是首选.

  • 可以使用 `$(origin ...)` 轻松检查变量的来源: cat Makefile &amp;&amp; make $(info CURDIR is from $(origin CURDIR)) $(info PWD is from $(origin PWD)) CURDIR is from文件 PWD 来自环境 (2认同)