Makefile中BREW?=语句的标准Shell等价写法及执行问题排查
问题分析与解决方法
原脚本的问题主要有两点:
- 用
env | grep BREW判断变量是否存在不可靠:env只能读取已导出到环境变量的变量,如果BREW是当前Shell的局部变量(未执行过export),env查不到;而且如果环境里有其他包含BREW字符串的变量(比如BREW_CASK_PATH),grep会误判。 - 代码冗余且逻辑多余:就算BREW已存在,
export BREW=$BREW属于无效操作,反而可能在特殊场景下引发意外。
等价的极简Shell写法
直接用Shell内置的参数展开语法,一行就能实现Makefile中BREW?=/opt/homebrew/bin/brew的逻辑:
export BREW=${BREW:-/opt/homebrew/bin/brew} echo "The path of brew is : $BREW"
解释:${VAR:-默认值}是Shell原生语法,含义是:如果VAR已定义且非空,就用VAR的值;否则使用冒号后的默认值。加上export是把BREW导出为环境变量,和原需求完全匹配。
偏好显式分支的正确写法
如果习惯用if分支实现逻辑,也可以这么写,避免grep的误判问题:
if [ -n "${BREW:-}" ]; then # BREW已定义且非空,确保导出到环境变量 export BREW else export BREW=/opt/homebrew/bin/brew fi echo "The path of brew is : $BREW"
解释:[ -n "${BREW:-}" ]用于检查BREW是否已定义且非空,${BREW:-}会在BREW未定义时返回空字符串,避免Shell抛出未定义变量的错误。
内容的提问来源于stack exchange,提问作者James Franco
相关产品推荐
相关产品推荐

