如何在bash中获取当前文件夹名并移除所有点(Makefile场景)
解决Makefile中获取去点后的当前文件夹名并注入Docker命令的问题
很简单,我帮你梳理两种可行的实现方式,刚好适配你要终止对应项目Docker容器的需求:
方法1:纯Shell命令实现(适合直接写在目标里)
Shell本身不支持直接嵌套参数替换,所以我们可以用临时变量或者命令替换来完成“提取文件夹名→移除所有.→拼接容器名”的流程:
方式A:用临时变量(可读性更好)
stop-container: # 先获取当前文件夹名,再移除所有点 dir=$$(basename "$$PWD"); dir_clean=$${dir//./}; \ docker ps -q --filter name="$${dir_clean}_mycontainer" | xargs -r docker stop
这里basename "$PWD"和你用的${PWD##*/}效果完全一致,都是提取当前文件夹名;$${dir//./}则是把文件夹名里的所有.替换为空。
方式B:用命令替换(更紧凑)
如果想写得更短,可以用tr命令直接删除所有.字符:
stop-container: docker ps -q --filter name="$$(basename "$$PWD" | tr -d '.')_mycontainer" | xargs -r docker stop
方法2:用Makefile内置函数(适合复用场景)
如果你需要在多个Makefile目标里用到这个去点后的项目名,建议先定义一个变量,用Makefile的内置函数处理,可读性和复用性都更强:
# 定义项目名变量:提取当前目录名,移除所有. PROJECT_NAME := $(subst .,,$(notdir $(PWD))) # 终止容器的目标 stop-container: docker ps -q --filter name="$(PROJECT_NAME)_mycontainer" | xargs -r docker stop
这里$(notdir $(PWD))是Makefile内置函数,作用和basename "$PWD"一样;$(subst .,,...)则是把字符串里的所有.替换为空,最终得到干净的项目名。
这样不管当前文件夹名是my.proj.v1还是test.app,都能得到myprojv1或者testapp,完美注入到容器名称前缀里。
内容的提问来源于stack exchange,提问作者Hirad Roshandel
相关产品推荐
相关产品推荐

