我正在尝试删除路径前缀。这是一个仅显示问题的小示例。
制作文件
dist_directory = ./dist
default: build
build: $(patsubst %.md, $(dist_directory)/%.html, $(wildcard *.md))
$(dist_directory)/%.html: %.md
@echo start
@echo $@
@echo ${$@//$(dist_directory)/}
@echo end
创建文件:touch stuff.md
然后构建:make
输出为:
start
dist/stuff.html
end
预期输出为:
start
dist/stuff.html
/stuff.html
end
Stack Exchange上有类似的帖子。但是,由于某种原因,它们没有在Makefile中为我工作。我可能做错了事。
https://unix.stackexchange.com/questions/311758/remove-specific-word-in-variable
Remove a fixed prefix/suffix from a string in Bash
Remove substring matching pattern both in the beginning and the end of the variable
答案 0 :(得分:0)
您在这里遇到很多问题。最基本的是,如果要使用shell变量,则必须转义美元符号,以使make不能对其进行解释。而且,您只能在shell变量上使用shell变量替换,而$@
是一个make变量,因此您需要:
@foo='$@' ; echo $${foo//$(dist_directory)/}
更微妙的是,make在调用配方时始终使用/bin/sh
(POSIX标准外壳程序),并且以上语法特定于bash。一种解决方法是在makefile中显式设置SHELL := /bin/bash
,以强制make使用bash。幸运的是,这不是必需的,因为POSIX sh也可以做到这一点,就像Reda在另一个答案中提到的那样:
@foo='$@' ; echo $${@##*/}
但是,您甚至不需要任何,因为make将automatic variable $*
设置为与词干匹配的目标部分({{ 1}}):
%
还将@echo $*.html
设置为$(@F)
变量的文件名部分:
$@
ETA
如果您想使用GNU做与shell变量扩展非常相似的操作,则可以使用:
@echo $(@F)