You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 09:07:01