macOS 环境变量加载探究

使用 macOS 安装环境,见到过很数种环境变量配置方法,每次也都是按照别人的代码,人家配置在哪 我就配置在哪,其实不太清楚有什么区别,决定记录下。

  • 本机 macOS 13.3,从 macOS Catalina(10.15) 开始,macOS的默认终端从bash变成了zsh ,所以在网上经常看到的 ~/.bash_profile 事实上是无法生效的,应该修改 ~/.zshrc
  • 我们常说的环境变量修改有两种方式,分为系统级别(对所有用户生效)和用户级别(对当前用户生效),像 /etc/profile 这种在 /etc 目录下的配置则都属于全局配置,~/ 则属于用户级别的,当然 macOS 也不是服务器,一般就自己一个人用,也不用分得太清楚。

系统级别

  1. /etc/profile 文件
    • 语法格式:采用 Shell 命令语法
    • 加载时间:系统启动时加载,更新重启生效。
    • 不建议修改,最好在用户级别的配置文件中进行个性化设置。
  2. /etc/paths 文件:路径格式,在系统启动时,这些路径会被添加到全局的$PATH环境变量的前面,影响所有用户和进程。
    • 语法格式:每行一个路径,没有特定的语法格式。
    • 加载时间:系统启动时加载,更新重启生效【但本机实测更新后,打开新终端窗口能够生效,不确定】。
    • 加载原理:系统启动时,其中的路径会被添加到系统的 $PATH 环境变量的前面
    • 全局环境变量建议修改这个文件。
    • macOS 特供(/etc/paths.d/同),在 Linux 系统中通常不是标准配置,Linux 通常使用 /etc/profile/etc/environment
  3. /etc/paths.d/ 目录:这个目录中可以放置其他路径设置的文件,每个文件包含一行一个路径。同样在系统启动时,这些路径会被添加到全局的$PATH环境变量的前面,影响所有用户和进程。
    • 语法格式:每个文件包含一组路径,没有特定的语法格式。
    • 加载时间:系统启动时加载。
    • 加载原理:/etc/profile 脚本中有一行 eval `/usr/libexec/path_helper -s,这个path_helper工具会读取/etc/paths.d目录下的文件里面的路径,然后加载在环境变量$PTAH

/etc/paths vs /etc/paths.d

  • macOS 系统升级时,/etc/paths文件在系统升级时可能会被覆盖或修改【不过事实上,我一年多以前配的路径现在还活的好好的,中间经历过一次大版本,数次小版本更新】,导致用户的自定义路径设置丢失,而/etc/paths.d/目录下的路径配置通常不会受到影响。

  • 模块化:如果一个软件需要将自己的可执行文件路径添加到全局$PATH中,它可以在/etc/paths.d/目录下创建一个独立的文件,这样具有更高的可维护性,当需要安装、卸载一个软件相关的路径时,系统只需要创建、删除一个单独的文件,整个路径配置也更加清晰易懂。

用户级别

  1. ~/.bash_profile~/.bash_login~/.profile
    • zsh 下不生效,如果想让其生效,可以修改 ~/.zshrc,在其中添加如:source ~/.bash_profile
    • 语法格式:采用 Shell 命令语法
    • 加载时间:用户登录时加载,根据存在的文件依次执行,优先级为 ~/.bash_profile > ~/.bash_login > ~/.profile
    • 加载原理:在用户登录时按顺序查找,按照从前往后的顺序读取,找到第一个存在的文件并执行其中的命令(后面的几个文件就会被忽略了)
      是否建议修改:建议在这些文件中进行个性化的环境设置,因为它们只对当前用户有效。
    • 建议在这个文件中设置用户级别的自定义配置,它只影响当前用户的非登录 shell 环境

注意:与 Bash 不同,Zsh 并没有类似于 Bash 中的 ~/.bash_profile 配置文件。在 Zsh 中,登录时的配置任务主要集中在 ~/.zprofile 文件中。(还有 .zlogin .zshenv 但是我本机中并没有这些文件)
在这里插入图片描述
2. ~/.bashrc~/.zshrc

  • 只在非登录 shell 中读取。它通常用于配置终端的行为和设置用户自定义的环境变量。
  • 语法格式:采用 Shell 命令语法
  • 加载时间:非登录shell,打开终端窗口时加载。
  • 加载原理:~/.bashrc 文件通常由 Bash 非登录 shell 在启动时加载。它适用于用户的自定义配置,只影响当前终端会话。
  • 建议在这个文件中设置用户级别的自定义配置,它只影响当前用户的非登录 shell 环境。

登录 shell 与非登录 shell

登录 shell :在用户登录系统时启动的交互式 shell。当用户通过终端、SSH 或其他方式登录到系统时,登录 shell 会执行用户的登录配置文件,例如 .bash_profile 等(这些文件根据所使用的 shell 类型可能有所不同),登录配置文件通常包含用于设置环境变量、执行启动脚本以及其他需要在登录时进行的操作。

非登录 shell :在已经登录系统的情况下启动的交互式 shell。当用户在登录后打开新的终端窗口或者运行一个 shell 脚本时,会启动一个非登录 shell。非登录 shell 不会读取用户的登录配置文件(所以,修改 ~/.bash_login 后需要 source xx 才能生效),而是读取 ~/.bashrc~/.zshrc等。这些文件通常包含设置别名、定义函数、配置 shell 提示符等。

在使用Windows系统时不会困惑,因为Windows时典型的单用户操作系统,同时只允许一个用户登录,但是在使用macOS后,会比较困惑,到底什么算用户登录?我在图形化界面输入密码后按回车?还是每打开一个终端?困惑的原因也是每次打开终端,都会有类似 login 的字眼。

在这里插入图片描述
通过几个例子来明确“用户登录”的概念,什么算“用户登录”,什么算“已经登录”

  1. 通过命令行登录一个无图形化界面的Linux操作系统:登录 shell,没什么疑问。
  2. 通过 SSH 远程连接云服务器:登录 shell。通过 SSH 远程登录到服务器时,会启动登录 shell,并执行你的登录配置文件,以确保你获得正确的环境和配置。
  3. 先通过 SSH 远程连接一次云服务器,同时连接第二次:每个 SSH 连接都会启动一个新的登录 shell,即使你在同一用户下打开多个 SSH 连接,它们也是独立的登录 shell。
  4. 通过用户登录界面登录图形化界面 Linux 系统:登录 shell,本质上与1相同。
  5. 通过用户登录界面登录图形化界面 Linux 系统后,再打开一个终端窗口:非登录 shell,不会再次执行登录配置文件,所以为了~/.bash_login中的配置能够做到重启终端生效,我们会在 .bashrc.zshrc 中配置 source ~/.bash_profile
  6. 使用 su 命令切换用户:非登录 shell,不会执行目标用户的登录配置文件。
  7. 执行 shell 脚本:非登录 shell,没什么疑问。

环境变量加载顺序

Mac系统的环境变量,加载顺序为:【这里仅就常见的几种方式做顺序展示,中间过程可能会有一些遗漏】
bash:/etc/profile -> /etc/paths -> /etc/paths.d/ 文件夹所有内容 -> ~/.bash_profile -> ~/.bash_login -> ~/.profile -> ~/.bashrc
zsh:/etc/profile -> /etc/paths -> /etc/paths.d/ 文件夹所有内容 -> ~/.zprofile -> ~/.zshrc

参考资料

  • Mac中环境变量加载顺序 - 宋建明 - 博客园 (cnblogs.com)

  • osx - Use /etc/paths or /etc/paths.d to add items to the PATH in macOS Sierra? - Unix & Linux Stack Exchange

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/59491.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Opencv-C++笔记 (16) : 几何变换 (图像的翻转(镜像),平移,旋转,仿射,透视变换)

文章目录 一、图像平移二、图像旋转2.1 求旋转矩阵2.2 求旋转后图像的尺寸2.3手工实现图像旋转2.4 opencv函数实现图像旋转 三、图像翻转3.1左右翻转3.2、上下翻转3.3 上下颠倒,左右相反 4、错切变换4.1 实现错切变换 5、仿射变换5.1 求解仿射变换5.2 OpenCV实现仿射…

【IDEA+Spark Streaming 3.4.1+Dstream监控套接字流统计WordCount保存至MySQL8】

【IDEASpark Streaming 3.4.1Dstream监控套接字流统计WordCount保存至MySQL8】 把DStream写入到MySQL数据库中 Spark 3.4.1MySQL 8.0.30sbt 1.9.2 文章目录 【IDEASpark Streaming 3.4.1Dstream监控套接字流统计WordCount保存至MySQL8】前言一、背景说明二、使用步骤1.引入库2…

某东详情页h5st 算法分析

文章目录 声明目标地址h5st 算法四大入参分析1. z值生成2. v值生成3. b值生成4. r值生成风控浅谈往期逆向文章推荐声明 本文章中所有内容仅供学习交流,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请私信我立即删除! 目标地址 aHR0cHM6Ly…

IO进程线程day7(2023.8.4)

一、Xmind整理: 二、课上练习: 练习1:创建两个线程:其中一个线程拷贝前半部分,另一个线程拷贝后半部分。 只允许开一份资源,且用互斥锁方式实现。 提示:找临界区--->找临界资源。 #includ…

单例模式和工厂模式

目录 今日良言:关关难过关关过,步步难行步步行 一、单例模式 1.饿汉模式 2.懒汉模式 二、工厂模式 今日良言:关关难过关关过,步步难行步步行 一、单例模式 首先来解释一下,什么是单例模式。 单例模式也就是单个…

linux 文件的权限

修改文件的权限 我这里有一个test.txt 文件,我们ll 查看一下该文件相应的属性信息 其中,权限的位置是相对固定的即: 第一个位置是r 权限,代表可读权限。 第二个位置是w权限,代表可修改权限。 第三个位置是x权限&…

一百四十一、Kettle——kettle8.2在Windows本地开启carte服务以及配置子服务器

一、目的 在kettle建好共享资源库后,为了给在服务器上部署kettle的carte服务躺雷,先在Windows本地测试一下怎么玩carte服务 二、Kettle版本以及在Windows本地安装路径 kettle版本是8.2 pdi-ce-8.2.0.0-342 kettle本地安装路径是D:\j…

linuxARM裸机学习笔记(2)----汇编LED灯实验

MX6ULL 的 IO IO的复用功能 这里的只使用了低五位,用来配置io口,其中bit0~bit3(MUX_MODE)就是设置 GPIO1_IO00 的复用功能的,GPIO1_IO00 一共可以复用为 9种功能 IO,分别对应 ALT0~ALT8。每种对应了不同的功能 io的属性配置 HY…

拦截器在SpringBoot中使用,HandlerInterceptor,WebMvcConfigurer

拦截器在Controller之前执行。 用于权限校验,日志记录,性能监控 在SpringBoot中使用 创建拦截器类:首先,创建一个Java类来实现拦截器逻辑。拦截器类应该实现Spring提供的HandlerInterceptor接口。实现拦截器方法:拦…

Unity数字可视化学校_昼夜(二)

1、时间设置: 2、新建夜晚 3、新建侧置球(BOX),测试灯光强度 降低亮度 色调:冷色调 4、自发光 新建shader 灯光控制 道路线: 建筑: 夜晚加灯光: 玻璃: 加大灯光数量: 边缘…

uni-ajax网络请求库使用

uni-ajax网络请求库使用 uni-ajax是什么 uni-ajax是基于 Promise 的轻量级 uni-app 网络请求库,具有开箱即用、轻量高效、灵活开发 特点。 下面是安装和使用教程 安装该请求库到项目中 npm install uni-ajax编辑工具类request.js // ajax.js// 引入 uni-ajax 模块 import ajax…

服务端高并发分布式结构演进之路

目录 一、常见概念 1.1基本概念 二、架构演进 2.1单机架构 2.2应用数据分离架构 2.3应用服务集群架构 2.4读写分离 / 主从分离架构 2.5引入缓存 —— 冷热分离架构 2.6垂直分库 2.7业务拆分 —— 微服务 一、常见概念 1.1基本概念 应用(Application&am…

Grafana集成prometheus(1.Prometheus安装)

下载docker镜像 docker pull prom/prometheus docker pull prom/node-exporter启动 node-exporter 该程序用以采集机器内存等数据 启动脚本 docker run -d -p 9100:9100 prom/node-exporter ss -anptl | grep 9100启动截图 prometheus 启动脚本 # 3b907f5313b7 为镜像i…

C++数据结构之平衡二叉搜索树(一)——AVL的实现(zig-zag/左右双旋/3+4重构)

目录 00.BBST——平衡二叉搜索树01.AVL树02.AVL的插入2.1单旋——zig 与 zag2.2插入节点后的单旋实例2.3手玩小样例2.4双旋实例2.5小结 03.AVL的删除3.1单旋删除3.2双旋删除3.3小结 04.34重构05.综合评价AVL5.1优点5.2缺点 00.BBST——平衡二叉搜索树 本文是介绍众多平衡二叉搜…

上海亚商投顾:沪指震荡微涨 金融、地产午后大幅走强

上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 市场情绪 三大指数早盘震荡,午后集体拉升反弹,创业板指涨超1%。券商等大金融板块午后再度走强&#…

【LNMP】LNMP

LNMP:是目前成熟的企业网站的应用模式之一,指的是一套协同工作的系统和相关软件;能够提供静态页面服务,也可以提供动态web服务 L Linux系统,操作系统N Nginx网站服务,前端,提供前端的静态…

抽象类的顶级理解

目录 1.抽象类的介绍 2. 抽象类语法 3.模板设计模式 1.抽象类的介绍 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果 一个类中没有包含足够的信息来描绘一个具体的对象&…

24. 两两交换链表中的节点

头结点dummyHead 定义结点temp用来暂存node2 让node1和node2位置互换:head(temp)->node1->node2->node3->node4 然后让temp等于交换后node1位置:head->node2->node1(temp)->node3->node4 class Solution { public:ListNode*…

学生信息管理系统springboot学校学籍专业数据java jsp源代码mysql

本项目为前几天收费帮学妹做的一个项目,Java EE JSP项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。 一、项目描述 学生信息管理系统springboot 系统3权限:超…

数据结构--线性表2-2

目录 一、线性表例题: 二、分配动态内存: 1.动态创建一个空顺序表的算法: 2.动态顺序表的插入算法: 3.动态顺序表的删除 三、线性表的链式表示和实现 例题1:创建链表并插入26个字母 例题2:在链表中取…