执行make cloud-metabase命令遇open未找到及语法错误,求排查
问题排查与解决办法
错误1:/bin/sh: 1: open: not found
原因
Makefile默认使用/bin/sh执行命令,而open是macOS专属的URL/文件打开命令,Linux环境的sh中无此命令;即使在macOS下,若sh指向bash/zsh的兼容模式,也可能出现找不到命令的情况。
解决办法
- macOS环境:在Makefile开头指定使用bash执行,避免sh的兼容性问题:
SHELL := /bin/bash - Linux环境:将
open替换为Linux桌面环境通用的xdg-open命令。 - 跨平台兼容:通过系统判断自动选择对应命令,替换原命令中的
open http://localhost:3001部分:if [ "$$(uname)" = "Darwin" ]; then open http://localhost:3001; else xdg-open http://localhost:3001; fi
错误2:bash: syntax error near unexpected token '('
原因
你直接在bash中复制Makefile里的命令测试时,忽略了Makefile的语法规则:Makefile中$$是用来转义单个$的(避免被解析为Makefile变量),实际执行时会变成$(...)做命令替换。但直接在bash里运行带$$的命令时,$$会被解析为当前shell的PID,导致命令变成类似1234(terraform ...)的错误格式,触发语法错误。
解决办法
- 单独测试时:把命令中的
$$改成单个$,正确的测试命令应为:ssh -o "IdentitiesOnly yes" -i private_key.pem ubuntu@$(terraform -chdir=./terraform output -raw ec2_public_dns) -N -f -L 3001:$(terraform -chdir=./terraform output -raw ec2_public_dns):3000 && open http://localhost:3001 && rm private_key.pem - Makefile中:保留
$$的写法,确保Makefile执行时正确解析为命令替换。
完整修正后的Makefile代码
将第66行替换为以下代码(优化重复命令,提高可读性与兼容性):
cloud-metabase: terraform -chdir=./terraform output -raw private_key > private_key.pem && \ chmod 600 private_key.pem && \ EC2_DNS=$$(terraform -chdir=./terraform output -raw ec2_public_dns) && \ ssh -o "IdentitiesOnly yes" -i private_key.pem ubuntu@$$EC2_DNS -N -f -L 3001:$$EC2_DNS:3000 && \ if [ "$$(uname)" = "Darwin" ]; then open http://localhost:3001; else xdg-open http://localhost:3001; fi && \ rm private_key.pem
(注意:Makefile中每行命令必须以制表符开头,用\换行保持逻辑连贯)
内容的提问来源于stack exchange,提问作者tbone
相关产品推荐
相关产品推荐

