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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用html+javascript打造公文一键排版系统15:一键删除所有空格

现在我们来实现一键删除所有空格的功能。 一、使用原有的代码来实现,测试效果并不理想 在这之前我们已经为String对象编写了一个使用正则表达式来删除所有空格的方法: //功能:删除字符串中的所有空格 //记录:20230726创建 Stri…

腾讯云-宝塔添加MySQL数据库

1. 数据库菜单 2. 添加数据库 3. 数据库添加成功 4. 上传数据库文件 5. 导入数据库文件 6. 开启数据库权限 7. 添加安全组 (宝塔/腾讯云) 8. Navicat 连接成功

MR分析——剔除与混淆因素相关的SNP

library(TwoSampleMR) i “ieu-b-4836” trait ‘Years_of_schooling’ remove_snp <- read.table(‘C:/Users/DELL/Desktop/要剔除的SNP.txt’, sep ‘\t’, header T) exposure extract_instruments(outcomes i) outcome <- read_outcome_data(snps exposure…

python 封装sql 增删改查连接MySQL

select * from Teacher limit 10 连接字符串配置MysqlConfig.py class MysqlConfig:HOST 192.168.56.210PORT 3306USER rootPASSWORD 1qaz0987654321DBStudentDBCHARSET utf8封装增删改查MysqlConnection.py Author: tkhywang 2810248865qq.com Date: 2023-06-19 15:44:48 Las…

rest api client code generator

一、搜索&#xff1a;REST API Client Code Generator 二、 安装成功后 配置java环境和node环境

线性代数 | 机器学习数学基础

前言 线性代数&#xff08;linear algebra&#xff09;是关于向量空间和线性映射的一个数学分支。它包括对线、面和子空间的研究&#xff0c;同时也涉及到所有的向量空间的一般性质。 本文主要介绍机器学习中所用到的线性代数核心基础概念&#xff0c;供读者学习阶段查漏补缺…

743. 网络延迟时间

有 n 个网络节点&#xff0c;标记为 1 到 n。 给你一个列表 times&#xff0c;表示信号经过 有向 边的传递时间。 times[i] (ui, vi, wi)&#xff0c;其中 ui 是源节点&#xff0c;vi 是目标节点&#xff0c; wi 是一个信号从源节点传递到目标节点的时间。 现在&#xff0c;…

JNI之Java实现蓝牙交互

蓝牙概述 蓝牙&#xff0c;是一种支持设备短距离通信&#xff08;一般10m内&#xff09;的无线电技术&#xff0c;能在包括移动电话、PDA、无线耳机、笔记本电脑、相关外设等众多设备之间&#xff0c;通过蓝牙设备之间的无线通信实现数据传输&#xff0c;实现数据传输&#xf…

【计算机视觉|语音分离】期望在嘈杂环境中聆听:一个用于语音分离的不依赖于讲话者的“音频-视觉模型”

本系列博文为深度学习/计算机视觉论文笔记&#xff0c;转载请注明出处 标题&#xff1a;Looking to Listen at the Cocktail Party: A Speaker-Independent Audio-Visual Model for Speech Separation 链接&#xff1a;Looking to listen at the cocktail party: a speaker-in…

【网络工程】网络流量分析工具 Wireshark

文章目录 第一章&#xff1a;WireShark介绍第二章&#xff1a;WireShark应用第三章&#xff1a;Wireshark 实战 第一章&#xff1a;WireShark介绍 Wireshark (前身 Ethereal)&#xff1a;它是一个强大的网络包分析工具 ! 此工具主要是用来捕获网络数据包的&#xff0c;并且自动…

75 | Python数据分析篇—— Numpy模块随机数函数、缺失值处理和矩阵操作

文章目录 Numpy模块随机数函数、缺失值处理和矩阵操作1. 随机数函数1.1 `np.random.rand()`1.2 `np.random.randn()`1.3 `np.random.randint()`1.4 `np.random.choice()`2. 处理缺失值NaN和inf2.1 `np.isnan()`2.2 `np.isinf()`2.3 `np.nan_to_num()`3. 矩阵相关的操作3.1 矩阵…

C++中实现多线程的三种方式

目录 1 背景2 方法 1 背景 力扣1116题 打印零和奇偶数。 2 方法 方法1&#xff1a;原子操作 class ZeroEvenOdd { private:int n;atomic<int> flag 0; public:ZeroEvenOdd(int n) {this->n n;}// printNumber(x) outputs "x", where x is an integer.…

zookeeper --- 基础篇

一、zookeeper简介 1.1、什么是zookeeper zookeeper官网&#xff1a;https://zookeeper.apache.org/ 大数据生态系统里的很多组件的命名都是某种动物或者昆虫&#xff0c;他是用来管 Hadoop&#xff08;大象&#xff09;、Hive(蜜蜂)、Pig(小 猪)的管理员。顾名思义就是管理…

zabbix触发器标签提取监控项子字符串实现对应告警恢复

0 实验环境 zabbix 6.0 1 监控项 1.1 监控项设置 通过zabbix agent自定义监控项&#xff0c;读取某文件内容模拟日志/trap告警&#xff0c;测试获取触发器标签中提取子字符串功能&#xff0c;以及相同标签的触发器自动恢复功能。 1.2 手工运行 手动触发之后&#xff0c;模…

你来问我来答,ChatGPT对话软件测试!主题互动

你来问我来答&#xff0c;ChatGPT对话软件测试&#xff01; 大家好&#xff0c;我是聪明而有趣的ChatGPT。作为IT专家&#xff0c;我将竭尽全力为你解答技术问题&#xff0c;并提供适合各个级别人群理解的解决方案。无论你是初学者还是专业人士&#xff0c;我都会用智能、简单…

在centos7上使用非编译方式安装ffmpeg

很多在centos7上安装ffmpeg的教程都需要使用编译方式的安装&#xff1b;编译时间较长而且需要配置; 后来搜索到可以通过加载rpm 源的方式实现快速便捷操作 第一种方式&#xff1a; 首先需要安装yum源&#xff1a; yum install epel-release yum install -y https://mirrors.…

C++中结构体的构造函数

2023年8月5日&#xff0c;周六上午 在C中&#xff0c;结构体和类是非常相似的&#xff0c;它们都可以具有构造函数。 事实上&#xff0c;在C中&#xff0c;结构体和类之间的唯一区别就是默认的访问权限不同。 结构体可以有默认构造函数、带参数的构造函数、拷贝构造函数等&am…

echarts 图例组件legend配置

legend 图例组件展示不同系列的图表类型标记、颜色、和名称。可以通过点击来控制哪个系列不展示。对于饼图来说&#xff0c;控制哪个数据不展示。 $> echarts5.4.0简单画一个饼图作为示例,设置legend:{show:true}展示图例。 const options {legend: {show: true,},series…

Java List(列表)

List 是一个有序、可重复的集合&#xff0c;集合中每个元素都有其对应的顺序索引。List 集合允许使用重复元素&#xff0c;可以通过索引来访问指定位置的集合元素。List 集合默认按元素的添加顺序设置元素的索引&#xff0c;第一个添加到 List 集合中的元素的索引为 0&#xff…

ELK 企业级日志分析系统(ElasticSearch、Logstash 和 Kiabana 详解)

目录 一.ELK简介 1.1ELK的概述 1.2ELK的组成 1.2.1 ElasticSearch 1.2.2 Logstash 1.2.3 Kibana 1.2.4 小总结 1.3可以添加其他组件 1.4filebeat 结合 logstash 带来好处 1.5日志处理的步骤 二.Elasticsearch 2.1Elasticsearch概述 2.2Elasticsearch核心概念 2.2.1接近…