Docker容器查询脚本在Makefile中报Bad substitution错误求助
解决Makefile中Docker命令报"/bin/sh: 1: Bad substitution"的问题
这个报错我太熟了!本质是Makefile默认的shell环境和你直接在终端用的bash不一样导致的,咱们一步步拆解解决:
错误原因
你直接在终端执行时用的是bash,支持${PWD##*/}(截取当前目录名)、${tmp//./}(全局替换点号)这类Bash专属参数扩展语法;但Makefile默认会调用POSIX标准的/bin/sh,它不支持这些高级替换,所以就抛出了"Bad substitution"错误。
两种解决方案
方案1:让Makefile用Bash执行命令
直接在Makefile开头指定使用bash作为执行shell,这样就能保留你原来的语法逻辑,同时建议用更规范的.PHONY替代FORCE声明伪目标:
# 指定Makefile使用bash执行命令 SHELL := /bin/bash # 声明伪目标,避免和同名文件冲突 .PHONY: remote remote: docker ps -q --filter name=$$(tmp=$${PWD##*/} && printf "%s_workspace" "$${tmp//./}")
方案2:改用POSIX sh兼容的写法(不依赖Bash)
如果想让脚本更通用,不绑定bash,可以用POSIX标准工具basename和sed实现同样的逻辑:
.PHONY: remote remote: docker ps -q --filter name=$$(basename "$$PWD" | sed 's/\./_/g')_workspace
basename "$PWD":获取当前目录的名称(自动去掉路径前缀)sed 's/\./_/g':把目录名里的所有.替换成_- 最后拼接
_workspace得到容器名称
小提示
Makefile里所有shell层面的$都要写成$$,不然会被Makefile优先解析成自身的变量,这也是你原来命令里用$$(...)和$${...}的原因,这点要注意哦~
内容的提问来源于stack exchange,提问作者Hirad Roshandel
相关产品推荐
相关产品推荐

