这是打印当前目录,而不是父目录:
run:
@cd ..; \
echo $(shell pwd)
我需要像这样的命令中的父目录:
run:
@cd ..; \
docker run -it --rm -p 8080:8080 -v $(shell pwd):/go/src/hello golang bash
答案 0 :(得分:1)
请记住要通过调用shell并将配方发送到shell以便执行来使它们起作用。 Make没有“内置”外壳,因此它不直接运行配方。
问题在于$(shell ..)
是一个make函数。所有的make变量和函数都在调用shell之前 进行了扩展(考虑:shell不知道如何处理make函数)。
这意味着首先扩展$(shell ...)
之类的make函数并运行pwd
,这将为您提供运行make进程的当前目录,然后将生成的字符串传递给shell执行。因此,shell会看到以下内容:
cd ..; echo /path/to/make/dir
您永远不需要在食谱中使用$(shell ...)
函数 ;配方已经在外壳中运行了!相反,您想在配方中使用Shell语法。一个警告是,您必须转义美元符号(用$
替换外壳$$
),以便make不会将它们解释为make变量。因此,如果您写:
run:
@cd ..; echo $$(pwd)
然后make扩展该字符串并将此命令发送到shell:
cd ..; echo $(pwd)
随心所欲。
答案 1 :(得分:0)
为什么不使用POSIXly强制变量PWD
?
run:
@cd ..; echo $$PWD
今天保存一个过程!