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
相关产品推荐
相关产品推荐

