macOS 环境变量加载探究
使用 macOS 安装环境,见到过很数种环境变量配置方法,每次也都是按照别人的代码,人家配置在哪 我就配置在哪,其实不太清楚有什么区别,决定记录下。
- 本机 macOS 13.3,从 macOS Catalina(10.15) 开始,macOS的默认终端从bash变成了zsh ,所以在网上经常看到的
~/.bash_profile事实上是无法生效的,应该修改~/.zshrc。 - 我们常说的环境变量修改有两种方式,分为系统级别(对所有用户生效)和用户级别(对当前用户生效),像
/etc/profile这种在 /etc 目录下的配置则都属于全局配置,~/则属于用户级别的,当然 macOS 也不是服务器,一般就自己一个人用,也不用分得太清楚。
系统级别
/etc/profile文件- 语法格式:采用 Shell 命令语法
- 加载时间:系统启动时加载,更新重启生效。
- 不建议修改,最好在用户级别的配置文件中进行个性化设置。
/etc/paths文件:路径格式,在系统启动时,这些路径会被添加到全局的$PATH环境变量的前面,影响所有用户和进程。- 语法格式:每行一个路径,没有特定的语法格式。
- 加载时间:系统启动时加载,更新重启生效【但本机实测更新后,打开新终端窗口能够生效,不确定】。
- 加载原理:系统启动时,其中的路径会被添加到系统的 $PATH 环境变量的前面
- 全局环境变量建议修改这个文件。
- macOS 特供(
/etc/paths.d/同),在 Linux 系统中通常不是标准配置,Linux 通常使用/etc/profile或/etc/environment
/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/目录下创建一个独立的文件,这样具有更高的可维护性,当需要安装、卸载一个软件相关的路径时,系统只需要创建、删除一个单独的文件,整个路径配置也更加清晰易懂。
用户级别
~/.bash_profile、~/.bash_login、~/.profile- zsh 下不生效,如果想让其生效,可以修改
~/.zshrc,在其中添加如:source ~/.bash_profile - 语法格式:采用 Shell 命令语法
- 加载时间:用户登录时加载,根据存在的文件依次执行,优先级为
~/.bash_profile > ~/.bash_login > ~/.profile。 - 加载原理:在用户登录时按顺序查找,按照从前往后的顺序读取,找到第一个存在的文件并执行其中的命令(后面的几个文件就会被忽略了)
是否建议修改:建议在这些文件中进行个性化的环境设置,因为它们只对当前用户有效。 - 建议在这个文件中设置用户级别的自定义配置,它只影响当前用户的非登录 shell 环境
- zsh 下不生效,如果想让其生效,可以修改
注意:与 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 的字眼。

通过几个例子来明确“用户登录”的概念,什么算“用户登录”,什么算“已经登录”
- 通过命令行登录一个无图形化界面的Linux操作系统:登录 shell,没什么疑问。
- 通过 SSH 远程连接云服务器:登录 shell。通过 SSH 远程登录到服务器时,会启动登录 shell,并执行你的登录配置文件,以确保你获得正确的环境和配置。
- 先通过 SSH 远程连接一次云服务器,同时连接第二次:每个 SSH 连接都会启动一个新的登录 shell,即使你在同一用户下打开多个 SSH 连接,它们也是独立的登录 shell。
- 通过用户登录界面登录图形化界面 Linux 系统:登录 shell,本质上与1相同。
- 通过用户登录界面登录图形化界面 Linux 系统后,再打开一个终端窗口:非登录 shell,不会再次执行登录配置文件,所以为了
~/.bash_login中的配置能够做到重启终端生效,我们会在.bashrc或.zshrc中配置source ~/.bash_profile。 - 使用 su 命令切换用户:非登录 shell,不会执行目标用户的登录配置文件。
- 执行 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/pathsor/etc/paths.dto add items to the PATH in macOS Sierra? - Unix & Linux Stack Exchange
相关文章:
macOS 环境变量加载探究
使用 macOS 安装环境,见到过很数种环境变量配置方法,每次也都是按照别人的代码,人家配置在哪 我就配置在哪,其实不太清楚有什么区别,决定记录下。 本机 macOS 13.3,从 macOS Catalina(10.15) 开始…...
在程序中如何判断该线程的线程id(get_id())的返回值是一个无效值
std::thread::id() 是std::thread::id的默认构造函数,它会创建一个空的std::thread::id对象。一个空的std::thread::id对象代表一个无效的线程标识符。 可以通过 std::thread::id 的成员函数 std::thread::id::operator() 来判断一个 std::thread::id 是否是一个空值…...
ffmpeg-ffplay代码架构简述
全局变量 /* Minimum SDL audio buffer size, in samples. */ // 最小音频缓冲 #define SDL_AUDIO_MIN_BUFFER_SIZE 512 /* Calculate actual buffer size keeping in mind not cause too frequent audio callbacks */ // 计算实际音频缓冲大小,并不需要太频繁…...
⛳ 多线程面试-什么是多线程上下文切换?
目录 ⛳ 多线程面试-什么是多线程上下文切换?🎁 Java中用到的线程调度算法是什么?🎨 什么是线程饥饿 ?你对线程优先级的理解是什么? ⛳ 多线程面试-什么是多线程上下文切换ÿ…...
vb+SQL车辆管理系统设计与实现
摘 要 随着信息时代的到来,信息高速公路的兴起,全球信息化进入了一个新的发展时期。人们越来越认识到计算机强大的信息模块处理功能,使之成为信息产业的基础和支柱。 我国经济的快速发展,汽车已经成为人们不可缺少的交通工具。对于拥有大量车辆的机关企事业来说,车辆的…...
java的枚举类
枚举类的概念和使用 1.枚举类的理解:类的对象只有有限个,确定的。我们称此为枚举类。 2.当需要定义一组常量时,强烈建议使用枚举类。对象便是所指的常量。 3.如果枚举类中只有一个对象,则可以作为单例模式的实现方式。 定义枚举类…...
基于java早餐店点餐系统源码设计与实现
摘 要 多姿多彩的世界带来了美好的生活,行业的发展也是形形色色的离不开技术的发展。作为时代进步的发展方面,信息技术至始至终都是成就行业发展的重要秘密。不论何种行业,大到国家、企业,小到团体、个人都在多方位的结合信息化技…...
ODOO16如何处理采购运输正常损耗的成本价核算?
《会计准则》规定:商品流通企业在采购商品过程中发生的运输费、装卸费、运输途中的合理损耗都归为采购存货成本中。 例如:采购A产品1000个,单价10元/个,途中运输正常损耗率是5%,因此实际入库是950个,入库金…...
【数据预测】基于白鲸优化算法BWO的VMD-KELM光伏发电功率预测 短期功率预测【Matlab代码#54】
文章目录 【可更换其他算法,获取资源请见文章第6节:资源获取】1. 白鲸优化算法BWO2. 变分模态分解VMD3. 核极限学习机KELM4. 部分代码展示5. 仿真结果展示6. 资源获取 【可更换其他算法,获取资源请见文章第6节:资源获取】 1. 白鲸…...
函数式编程-将过程作为返回值的应用:分步过程
之前的文章提到函数式编程的一等函数(First-class Function)四个性质中有“可以将过程作为返回值”这一点,但这一点在实际使用中不如“将过程作为参数”(高阶函数)用得多。本文介绍一种这个性质用于分步函数的应用。 …...
Mysql-学习笔记
文章目录 1. 数据库1.1 Mysql安装及常用代码1.2 SQL介绍1.3 SQL分类1. DDL-操作数据库,表2. DML-对表中的数据进行增删改3. DQL-对表中的数据进行查询条件查询模糊查询排序查询分组查询分页查询 4. DCL-对数据库进行权限控制外键约束表关系-多对多多表查询事务 1. 数…...
【雕爷学编程】Arduino动手做(187)---1.3寸OLED液晶屏模块2
37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的&#x…...
Windows用户如何安装新版本cpolar内网穿透
Windows用户如何安装新版本cpolar内网穿透 文章目录 Windows用户如何安装新版本cpolar内网穿透 在科学技术高度发达的今天,我们身边充斥着各种电子产品,这些电子产品不仅为我们的工作带来极大的便利,也让生活变得丰富多彩。我们可以使用便携的…...
MacBookPro安装Win10,Wifi不能用了,触控板不能用了(2)
一、问题 去年在MacBookPro上装过Win10,当初只分配了60G空间。各方面原因需要重装系统,上个月装了一晚上,也无法连接Wifi,触控板只能当鼠标左键用。 后来发现是没有相关驱动造成的,于是从Mac系统联网找到网卡驱动&am…...
理解C++中变量的作用域
理解C中变量的作用域 常规变量(如前面定义的所有变量)的作用域很明确,只能在作用域内使用它们,如果您在作用域外使用它们,编译器将无法识别,导致程序无法通过编译。在作用域外面,变量是未定义的…...
vue+element-ui给全局请求设置一个loading样式
老项目后台管理,要在每个页面请求的时候都添加一个loading,为了统一和防止一个页面多次请求页面出现闪烁的情况同意在request.js中添加了一个全局loading。 想要的效果: 1.在请求的时候创建一个loading样式,请求结束是关闭。 2…...
传球游戏
题目描述 上体育课的时候,小蛮的老师经常带着同学们一起做游戏。这次,老师带着同学们一起做传球游戏。 游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球,每个…...
智能卡通用安全检测指南 思度文库
范围 本标准规定了智能卡类产品进行安全性检测的一般性过程和方法。 本标准适用于智能卡安全性检测评估和认证。 规范性引用文件 下列文件对于本文件的应用是必不可少的。凡是注日期的引用文件,仅注日期的版本适用于本文件。凡是不注日期的引用文件,…...
Maven设置阿里云路径(防止加载过慢)
<?xml version"1.0" encoding"UTF-8"?><!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding …...
JavaScript原型链污染漏洞复现与防范
目录 什么是原型链污染漏洞? 复现原型链污染漏洞 防范原型链污染漏洞 什么是原型链污染漏洞? 原型链污染是JavaScript中的一种安全漏洞,利用该漏洞可以修改对象的原型,从而影响对象及其属性的行为。攻击者可以通过修改原型链来…...
Python偏函数partial的用法小结
functools.partial(func, /, *args, **keywords) 会返回一个新可调用对象,它把原函数 func 的部分位置参数和/或关键字参数“预先绑定”。 这样你就能得到一个“定制版”的函数,后续只需要补齐剩余参数即可调用。返回对象类型是 functools.partial 实例&…...
ICLR 2026 | 告别Top-K检索!RF-Mem在嵌入空间逐步重构证据链,实现长记忆渐进式唤醒
今天分享一篇来自大连理工大学、香港城市大学、华为和中国科学技术大学的最新工作 RF-Mem,发表于ICLR 2026。这篇工作关注个性化大模型中的一个关键问题:当用户历史越来越长时,模型到底该怎样从海量记忆里,准确找回“此时此刻最相…...
Pixel Aurora Engine惊艳图集:基于‘进化像素’哲学的跨时代视觉融合
Pixel Aurora Engine惊艳图集:基于进化像素哲学的跨时代视觉融合 1. 像素极光引擎概览 Pixel Aurora Engine是一款革命性的AI绘图工作站,它将现代扩散模型技术与复古像素艺术完美融合。这款工具重新定义了数字艺术创作方式,让用户能够通过简…...
激光+视觉+IMU+RTK融合实战:如何用多传感器打造厘米级三维重建系统?
激光视觉IMURTK融合实战:如何用多传感器打造厘米级三维重建系统? 在自动驾驶和机器人领域,三维重建技术正经历着从实验室走向工业落地的关键转折。传统单一传感器方案已无法满足复杂场景下的精度需求,而多传感器融合正成为突破性能…...
DeTikZify:AI驱动的科研图表代码自动化解决方案
DeTikZify:AI驱动的科研图表代码自动化解决方案 【免费下载链接】DeTikZify Synthesizing Graphics Programs for Scientific Figures and Sketches with TikZ 项目地址: https://gitcode.com/gh_mirrors/de/DeTikZify 一、科研绘图的隐形痛点:我…...
TDengine IDMP 工业数据建模 —— 数据标准化
3.4 数据标准化 工业环境通常从多个数据源采集数据,这些数据往往命名不一致、物理单位各异、数据结构不同。如果没有标准化,跨资产分析、AI 生成洞察和数据汇聚将变得不可靠甚至无法实现。TDengine IDMP 提供了多种机制,对整个资产模型中的数…...
Node.js后端服务开发:搭建调用Lingbot-Depth-Pretrain-ViTL-14的API接口
Node.js后端服务开发:搭建调用Lingbot-Depth-Pretrain-ViTL-14的API接口 你是不是遇到过这样的场景:手头有一个很厉害的AI模型,比如能估算图片深度的Lingbot-Depth-Pretrain-ViTL-14,但不知道怎么把它变成一个方便调用的服务&…...
Cursor Composer 2 技术报告拆解:MoE 预训练、RL 环境设计与 CursorBench 基准的工程实践
在生产级代码仓库里,一个 AI Agent 面对的往往不是“实现某个功能”这样清晰的任务,而是“新特性上线后出现诡异 bug,日志里只有 954 个 JSON 响应,栈踪迹完全不可靠”。它必须自己跨文件定位、写启发式检测器、调参避免误报&…...
**元宇宙经济中的智能合约开发实战:用Solidity构建去中心化资产交易系统**在元宇宙经济蓬勃发展的今
元宇宙经济中的智能合约开发实战:用Solidity构建去中心化资产交易系统 在元宇宙经济蓬勃发展的今天,数字资产的流通与确权成为核心议题。无论是虚拟土地、NFT艺术品还是游戏道具,背后都离不开区块链技术的支持。而智能合约正是连接现实世界资…...
别让电源拖后腿!手把手教你搞定Xilinx 7系列FPGA(以XC7K325T为例)的供电设计
别让电源拖后腿!手把手教你搞定Xilinx 7系列FPGA(以XC7K325T为例)的供电设计 第一次翻开Xilinx 7系列FPGA的硬件手册时,相信不少工程师都会被密密麻麻的电源轨搞得头晕目眩。VCCINT、VCCBRAM、VCCO、VMGTAVCC...这些看似简单的电压…...
