2016-02-04 88 views
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 :)

回答

1

好吧,我要切换到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. 

:-)

脚注:不知道你在努力达成什么, 但我估计可能有更多的使 - 这样做的方式!