Mac OS High Sierra下sudo执行tns doctor丢失环境变量求助
解决sudo tns doctor无法识别ANDROID_HOME/JAVA_HOME的问题
这个问题我之前帮好几个开发者排查过,核心原因很简单:sudo执行命令时不会默认继承普通用户的环境变量,而且root用户的shell配置文件和你当前用户的完全分开,你在.bash_profile/.bashrc里配置的变量,root会话根本读不到。
给你三个靠谱的解决方案,按需选择:
1. 临时快速解决:用sudo的-E参数保留环境变量
如果你只是临时需要用sudo执行tns doctor,直接加-E参数就行,它会让sudo保留当前用户的所有环境变量:
sudo -E tns doctor
这个方法不用改任何配置,适合偶尔用一次的场景。
2. 给root用户单独配置环境变量
如果需要长期用sudo执行tns命令,可以把环境变量配置到root的shell配置文件里:
- 先切换到root用户:
sudo su - - 编辑root的
.bash_profile文件(如果是bash shell的话):nano ~/.bash_profile - 把你普通用户配置里的环境变量复制进去,比如:
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_291.jdk/Contents/Home export ANDROID_HOME=/Users/你的用户名/Library/Android/sdk export PATH=$PATH:$JAVA_HOME/bin:$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools - 按
Ctrl+O保存,Ctrl+X退出,然后执行source ~/.bash_profile让配置立即生效 - 退出root(输入
exit),再试sudo tns doctor就正常了
3. 配置系统级环境变量(所有用户通用)
要是想让所有用户(包括root)都能读到这些环境变量,可以写到系统级的配置文件里:
- 编辑
/etc/profile文件:sudo nano /etc/profile - 在文件末尾添加和上面一样的环境变量配置
- 保存退出后,重启终端或者执行
source /etc/profile,之后不管是普通用户还是sudo执行,都能识别到变量了
补充说明
sudo默认会重置环境变量到一个安全的默认集合,目的是防止普通用户的环境变量可能带来的安全风险,所以-E参数就是告诉sudo“不要重置,保留我当前的环境”。而把变量写到root自己的配置或者系统级配置里,就是让root会话自己加载这些变量,从根源解决问题。
内容的提问来源于stack exchange,提问作者Or Betzalel
相关产品推荐
相关产品推荐

