设为首页 收藏本站
查看: 1154|回复: 0

[经验分享] 【转】Mac OS X 中 Zsh 下 PATH 环境变量的正确设置

[复制链接]
累计签到:8 天
连续签到:1 天
发表于 2015-12-31 10:03:30 | 显示全部楼层 |阅读模式
  在 Mac OS X 中使用 zsh,环境变量 PATH 一不小心就会变得很紊乱,表现为自己设置的路径总是被放到系统路径之后,部分路径还会有重复。这是我们不太了解 zsh 启动时加载文件的顺序和 Mac OS X 的 shell 类型导致的。
  zsh 启动过程中会依次读取以下文件:


  • /etc/zshenv
  • $ZDOTDIR/.zshenv($ZDOTDIR 未设置时默认为 $HOME)
  • 如果是 login shell,读取 /etc/zprofile, $ZDOTDIR/.zprofile
  • 如果是 interactive shell,读取 /etc/zshrc, $ZDOTDIR/.zshrc
  • 如果是 login shell,读取 /etc/zlogin, $ZDOTDIR/.zlogin
  login shell 是用户登陆时,输入用户名和密码后启动的 shell,non-login shell 是登录以后所打开的 shell。interactive shell 在终端上执行,shell 等待你的输入,并且立即执行你提交的命令,跟用户存在交互;non-interactive shell 以 shell script(非交互)方式执行。
  interactive, login shell 比较常见,我们 ssh 到远程主机的字符终端时,就是典型的这类 shell。non-interactive, login shell 很少见,一些 X 设置会让你登陆,目的仅仅是加载它的相应设置文件。interactive, non-login shell 通常发生在通过已存在的 session 启动一个新的 shell,比如 linux 下的 screen、tmux,linux 下桌面环境启动的 shell 也是这类 shell,比如 gnome shell。non-interactive, non-login shell 很常见,我们执行 shell script 就是这类 shell。




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28


+--------------+-------------+-------------+-----------------+-----------------+
|              |    login    |  non-login  |      login      |    non-login    |
|              | interactive | interactive | non-interactive | non-interactive |
+--------------+-------------+-------------+-----------------+-----------------+
|/etc/zshenv   |     A       |      A      |        A        |        A        |
+--------------+-------------+-------------+-----------------+-----------------+
|~/.zshenv     |     B       |      B      |        B        |        B        |
+--------------+-------------+-------------+-----------------+-----------------+
|/etc/zprofile |     C       |             |        C        |                 |
+--------------+-------------+-------------+-----------------+-----------------+
|~/.zprofile   |     D       |             |        D        |                 |
+--------------+-------------+-------------+-----------------+-----------------+
|/etc/zshrc    |     E       |      C      |                 |                 |
+--------------+-------------+-------------+-----------------+-----------------+
|~/.zshrc      |     F       |      D      |                 |                 |
+--------------+-------------+-------------+-----------------+-----------------+
|/etc/zlogin   |     G       |             |        E        |                 |
+--------------+-------------+-------------+-----------------+-----------------+
|~/.zlogin     |     H       |             |        F        |                 |
+--------------+-------------+-------------+-----------------+-----------------+
|              |             |             |                 |                 |
+--------------+-------------+-------------+-----------------+-----------------+
|              |             |             |                 |                 |
+--------------+-------------+-------------+-----------------+-----------------+
|~/.zlogout    |     I       |             |        G        |                 |
+--------------+-------------+-------------+-----------------+-----------------+
|/etc/zlogout  |     J       |             |        H        |                 |
+--------------+-------------+-------------+-----------------+-----------------+
  那么问题来了,在 Mac OS X 中打开 iTerm.app 或者 Terminal.app 启动的 shell 是什么类型呢?通常来说,应该是 interactive, non-login shell,但实际上却是 interactive, login shell,至于为什么这样就不深究了。下面的测试代码可以证明:




1
2


[[ -o login ]] && echo 'yes' || echo 'no'
[[ -o interactive ]] && echo 'yes' || echo 'no'

  所以,打开 iTerm.app 或者 Terminal.app 启动的 shell 会读取上述1-5中存在的所有文件,如果其中多个文件均对 PATH 环境变量作过设置,那么最终呈现的 PATH 环境变量就会比较复杂,部分路径重复也就不足为奇了。查看 /etc/zshenv,会发现调用的是/usr/libexec/path_helper,而它加载的正是系统路径,并且将系统路径放在最前。如果接下来用户在 $ZDOTDIR 中的文件中加载了自己设置的路径并置于最前,再接下来再加载的 /etc/zprofile、/etc/zshrc 可能还会调用/usr/libexec/path_helper,又造成了系统路径重新被放到最前面,形成了奇葩的 PATH 环境变量系统路径、自设路径、系统路径交错的现象。
  了解了这么多,解决方法也很简单,那就是上述1-5中仅让必要的文件涉及 PATH 环境变量。比如在 /etc/zshenv 中通过调用/usr/libexec/path_helper设置系统路径,$ZDOTDIR/.zshenv 中将自设路径放在最前,其余文件均不涉及 PATH 环境变量设置。
  
  原文地址:https://www.jmlog.com/set-path-in-zsh-on-mac-os-x/

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-158716-1-1.html 上篇帖子: Mac OS X 和 XCode 快捷键 下篇帖子: Mac OS X 背后的故事(六)Cordell Ratzlaff 引发的 Aqua 革命(上)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表