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 外壳程序。
  • profilezshrc 都是一个文本配置文件
  • 如果是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, 进行验证,大功告成。

2. 参考资料

发布了194 篇原创文章 · 获赞 262 · 访问量 48万+

猜你喜欢

转载自blog.csdn.net/hadues/article/details/104876654