Mac OSX 每次打开shell执行maven命令都需要`source /etc/profile` 怎么办?
Mac OSX 每次打开shell执行maven命令都需要source /etc/profile
怎么办?
1.1 问题描述
今天遇到一个奇怪的现象,在我的新电脑Mac OSX 10.15.3 上安装并配置完maven 环境变量后,每次打开shell, 想要使用maven 命令,都需要重新source /etc/profile
执行下。
为了解决这个问题,搜索了一些解决方案,最终尝试成功。
1.2 问题分析
如果我们在终端中输入如下命令:
cat /etc/shells
执行成功后,我们可以看到有mac osx 支持多个shell 类型
# List of acceptable shells for chpass(1).
# Ftpd will not allow users to connect who are not using
# one of these shells.
/bin/bash
/bin/csh
/bin/dash
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh
而且值得注意的是:
在今年苹果公司发布了macOS Catalina(10.15),macOS的默认终端从bash变成了zsh.
也就是说
bash
是一个shell
外壳程序,zsh
也是一个shell
外壳程序。profile
和zshrc
都是一个文本配置文件- 如果是centos 7 或mac osx 10.15 以下版本,默认shell 环境是bash,系统环境变量的配置文件是
/etc/profile
文件- 如果是mac osx 10.15 以上版本,默认shell 环境是zsh , 那么系统环境变量的配置文件默认是
/etc/zshrc
文件
1.3 解决方案
明确了原因,问题就很好解决了,解决思路可以分为三种:
- 第一种:
修改shell 类型,将zsh 修改还原为 bash
-这种方式不推荐,因为既然新版默认使用了这个zsh,必然是因为zsh 比bash更优秀。- 第二种:将
etc/profile
中配置的环境变量追加到 etc/zshrc 文件最后几行。- 第三种:在
etc/zshrc
系统环境变量配置文件中添加一条命令source etc/profile
然后执行source /etc/zshrc
这种方式就是不影响之前的用户习惯,我觉得是最佳解决方案,原理如下:
- 系统启动时候先加载
etc/zshrc
中配置的环境变量命令- 然后发现了
source etc/profile
命令然后开始执行- 当
source etc/profile
命令执行后这个文件里面配置的环境变量生效
1.3.1 第一步:修改环境变量配置文件读写权限
- Mac OSX 如果是一个新的电脑针对这两个文件只有只读文件权限,因此需要将这个文件授予写的权限。
为了给系统环境变量配置文件添加读写权限,我们需要输入如下命令:
给etc/profile 文件添加权限
sudo chmod 777 /etc/profile
给etc/zshrc
文件添加权限
sudo chmod 777 /etc/zshrc
以上命令什么意思呢?
- sudo 如果不指定用户,默认是切换到root 用户身份执行命令
- chmod 是一个文件权限修改命令集
- 777 是权限代号,表示授予文件读,写,执行的权限。
下面一张图完美解释了777 的含义。
1.3.2 第二步: /etc/profile 文件中添加环境变量
- 打开etc/profile 文件需要输入如下命令:
vi /etc/profile
- 然后按下ESC 键,再按下i 键,进入编辑插入模式。
- 最后一行添加如下内容
/etc/profile 文件最终内容如下:
# System-wide .profile for sh(1)
if [ -x /usr/libexec/path_helper ]; then
eval `/usr/libexec/path_helper -s`
fi
if [ "${BASH-no}" != "no" ]; then
[ -r /etc/bashrc ] && . /etc/bashrc
fi
# Config JDK or JRE
export JAVA_HOME=/Library/java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home
export PATH=.:$PATH:$JAVA_HOME/bin
export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/jre/lib/rt.jar:.
# Config Others
export MAVEN_HOME=/opt/app/maven/apache-maven-3.6.3
export PATH=$PATH:$MAVEN_HOME/bin
1.3.3 第三步:修改etc/zshrc文件内容
修改etc/zshrc 文件内容如下:
[[ -n ${key[Delete]} ]] && bindkey "${key[Delete]}" delete-char
[[ -n ${key[Home]} ]] && bindkey "${key[Home]}" beginning-of-line
[[ -n ${key[End]} ]] && bindkey "${key[End]}" end-of-line
[[ -n ${key[Up]} ]] && bindkey "${key[Up]}" up-line-or-search
[[ -n ${key[Down]} ]] && bindkey "${key[Down]}" down-line-or-search
# Default prompt
PS1="%n@%m %1~ %# "
# Useful support for interacting with Terminal.app or other terminal programs
[ -r "/etc/zshrc_$TERM_PROGRAM" ] && . "/etc/zshrc_$TERM_PROGRAM"
# config bash System environment variables
source /etc/profile
思路是
/etc/zshrc
命令执行的时候调用source /etc/profile
里面的环境变量
1.3.3 第四步: 让环境变量配置文件生效
系统环境变量配置文件一旦修改后如果不想重启,想立即生效,则需要输入如下命令。
source /etc/zshrc
值得注意的是,今后我们修改环境变量在
etc/profile
文件中,修改完成后不再需要执行source /etc/profile
命令,而是执行上面这个命令,因为这个配置文件里面调用了source /etc/profile
命令。
重新打开shell, 进行验证,大功告成。