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

执行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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 05:10:50