Mac终端环境变量可用但.sh脚本无法检测到的问题
解决macOS中Shell脚本无法读取ANDROID_HOME环境变量的问题
原因分析
- 非交互式Shell不加载用户配置文件:当你用
sh ./script.sh或直接./script.sh(若脚本shebang为#!/bin/sh)执行脚本时,启动的是非交互式Shell,这类Shell不会自动加载.bash_profile、.zshrc、.zprofile这类仅针对交互式Shell的配置文件,导致终端能读到的环境变量在脚本中无法获取。 - sudo执行会重置环境变量:使用sudo运行脚本时,会以root身份启动进程,默认会重置大部分用户级环境变量,自然无法读取你配置的ANDROID_HOME。
可行解决方案
方案1:修改脚本Shebang指定使用zsh
在脚本的第一行添加zsh的Shebang:
#!/bin/zsh
给脚本添加执行权限(若未添加):
chmod +x script.sh
之后用./script.sh执行,脚本会以zsh运行并加载你的zsh配置文件,从而读取到ANDROID_HOME。
方案2:在脚本中手动加载配置文件
若不想修改Shebang,可在脚本开头主动source你的配置文件:
# 根据实际配置的文件选择,比如加载zprofile source ~/.zprofile # 若使用bash则加载bash_profile:source ~/.bash_profile
脚本执行时会主动加载环境变量配置,即可获取到ANDROID_HOME。
方案3:将环境变量配置到全局Shell文件
把ANDROID_HOME配置放到/etc/profile或/etc/zshrc这类全局配置文件中(需sudo编辑),这样所有Shell环境(包括非交互式)都能读取到变量:
sudo echo 'export ANDROID_HOME=/你的AndroidSDK实际路径' >> /etc/profile sudo echo 'export PATH=$PATH:$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools' >> /etc/profile
配置完成后重启终端或执行source /etc/profile,脚本即可正常读取变量。
方案4:执行脚本时手动传入环境变量
临时测试场景下,可直接在执行脚本时传入变量:
ANDROID_HOME=/你的AndroidSDK实际路径 ./script.sh
内容的提问来源于stack exchange,提问作者Isma Rekathakusuma
相关产品推荐
相关产品推荐

