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

Makefile中使用[[报错/bin/sh: 1: [[: not found的原因排查

Makefile中[[报错的原因及解决办法

问题原因

Make默认使用/bin/sh作为执行shell命令的解释器,而[[是Bash专属的条件判断语法,不属于POSIX标准Shell的规范。当Make执行$(shell [[ ... ]])时,调用的是不支持[[的/bin/sh,因此抛出[[: not found]]的错误。

尽管你执行时最终输出了部分预期结果,但报错是因为shell解释器无法识别[[语法,属于未解决的兼容性问题。

解决方案

1. 改用POSIX标准的[命令

将[[替换为POSIX兼容的[命令,同时给变量添加引号避免空值解析问题:

get_tag:
	$(eval TAG=$(shell [ -z "${DOCKER_TAG}" ] && echo "latest" || echo "${DOCKER_TAG}"))
	echo ${TAG}

2. 指定Make使用Bash作为解释器

在Makefile开头声明SHELL变量,强制使用Bash执行命令:

SHELL := /bin/bash

get_tag:
	$(eval TAG=$(shell [[ -z ${DOCKER_TAG} ]] && echo "latest" || echo ${DOCKER_TAG}))
	echo ${TAG}

3. 用Make原生语法实现(推荐)

无需借助shell命令,直接使用Make的条件赋值运算符?=即可实现需求,更高效且无兼容性问题:

# 若环境变量DOCKER_TAG存在则沿用,否则默认设为latest
TAG ?= latest

get_tag:
	echo ${TAG}

?=的作用是:仅当变量TAG未被定义时(包括环境变量传递的情况,因为环境变量会自动成为Make的全局变量),才将其赋值为latest。

内容的提问来源于stack exchange,提问作者Sam Reynolds

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 11:02:18