0
我有一个可变的路径,例如从$此路径(壳PWD):在gnu中获取父目录,祖父母目录等?
C:\a\b\c\d\e\f
我想这是什么,并把它保存在一个变量:
C:\a\b\c\d\e
C:\a\b\c\d
C:\a\b\c
C:\a\b
C:\a
C:\
怎么办它在GNU吗?以及如果没有更多的父母如何停止(到达C :)
我有一个可变的路径,例如从$此路径(壳PWD):在gnu中获取父目录,祖父母目录等?
C:\a\b\c\d\e\f
我想这是什么,并把它保存在一个变量:
C:\a\b\c\d\e
C:\a\b\c\d
C:\a\b\c
C:\a\b
C:\a
C:\
怎么办它在GNU吗?以及如果没有更多的父母如何停止(到达C :)
好吧,我要切换到posix路径模式。 没有appologgies。 当cygwin可用时,生命太短而无法解决Windows路径问题。 (我会注意到虽然$(dir)
识别反斜杠)。
所以,一个函数。
您只需吐出参数 ,然后再次调用该函数,但是这次将最后一个路径组件剪掉。 喜欢的东西
parents = $1 $(call parents,$(dir $1))
第一个问题: $(dir a/b/c/d)
回报a/b/c/
。 精细, 除了$(dir /a/b/c/)
只是给你a/b/c/
再次。 你需要调用之前带,其最后的斜线:
parents = $1 $(call parents,$(patsubst %/,%,$(dir $1)))
确定。 问题现在是这个递归调用永远不会终止序列。
我们需要停止呼叫parents
一旦$1
没有斜杠。想到几种方法。 一种方法是音译/
为 (这就是
$(subst …)
工作), 然后停止,如果得到的字数($(words …)
)为1():
parents = \
$1 \
$(if $(filter-out,1,$(words $(subst /, ,$1))), \
$(call parents,$(patsubst %/,%,$(dir $1))))
(希望我有该嵌套右)赠送:。
$ cat Makefile
parents = \
$1 \
$(if $(filter-out 1,$(words $(subst /, ,$1))), \
$(call parents,$(patsubst %/,%,$(dir $1))))
$(error [$(call parents,/a/b/c/d/e/f)])
$ make
Makefile:6: *** [/a/b/c/d/e/f /a/b/c/d/e /a/b/c/d /a/b/c /a/b /a ]. Stop.
:-)
脚注:不知道你在努力达成什么, 但我估计可能有更多的使 - 这样做的方式!