.bash_profile、.bashrc、.zshrc、/etc/profile 这些文件,都是Shell 启动时加载的环境配置文件,但是它们有不同的作用场景。
1. 核心概念
| 文件 | 作用 | 场景 | 适用 |
|---|---|---|---|
| /etc/profile | 全局环境变量配置(系统级) | 所有用户登录shell时 | 所有用户 |
| ~/.bash_profile | 用户级登录Shell配置 | bash登录时加载 | 当前用户 |
| ~/.bashrc | 交互式bash配置 | bash交互shell、子shell | 当前用户 |
| ~/.zshrc | 用户级zsh配置 | zsh交互式shell | 当前用户 |
2.详细区别
2.1 /etc/profile(全局配置)
-
系统级,所有用户登录shell都会读取
-
只对登录Shell生效
-
通常用来配置全局 PATH、LANG 变量
2.2 ~/.bash_profile(bash登录时加载)
-
用户级配置,只影响当前用户
-
只在 bash 登录Shell 时加载(mac早期默认bash)
-
常用来 export 环境变量、source ~/.bashrc
-
只启动一次(登录时)
✅ 典型写法:
export PATH=$PATH:/usr/local/bin
source ~/.bashrc
2.3 ~/.bashrc(bash交互时加载)
-
只在交互式bash终端、子shell时加载
-
适合配置 alias、PS1、自动补全
-
不会在“登录Shell”自动加载,通常通过 .bash_profile 间接加载
✅ 举例:
alias ll='ls -la'
2.4 ~/.zshrc(zsh下专用)
-
zsh 的用户级配置文件
-
zsh 每次打开新终端都会加载
-
等效于 bash 的 .bashrc + .bash_profile
-
macOS Catalina (10.15) 以后默认 shell 变成了 zsh
✅ 你平时用的 alias、PATH 配置都在这里设置。
3. macOS 下几个文件的关系图
终端启动 (zsh 用户)
└──> 加载 ~/.zshrc (核心配置文件)
终端启动 (bash 用户)
└──> 加载 ~/.bash_profile
└──> 通常会 source ~/.bashrc
系统级(所有用户)
└──> /etc/profile
4. mac下环境变量应设置在哪个文件中
4.1 如果你用的是 zsh(/bin/zsh)
配置在:
~/.zshrc
# 修改完之后是文件生效:
source ~/.zshrc
这是 90% Mac 用户的正确位置(Catalina 之后默认)。
4.2 如果你用的是 bash(/bin/bash)
配置在:
~/.bash_profile
# 修改完之后是文件生效:
source ~/.bash_profile
老Mac(Catalina 之前)默认是 bash。不过Catalina之后的版本也可以用。
4.3 为什么~/.zshrc中会有 source ~/.bash_profile
source ~/.bash_profile
-
意思是 强制去加载以前写在 .bash_profile 里的配置。
-
这是兼容老习惯的写法(比如 GOPATH、PATH 可能当时写在 .bash_profile 里)。
-
所以你在/.bash_profile中配置和在/.zshrc中配置环境变量都会生效
5. mac启动时会加载哪些内容
mac 启动时加载的文件(系统启动 → 用户登录)
5.1. macOS 启动流程(开机启动)
| 阶段 | 加载内容 |
|---|---|
| 1. EFI Bootloader | 固件、硬件初始化 |
| 2. macOS 内核(XNU) | 系统核心驱动 |
| 3. launchd(系统初始化进程) | 启动所有守护进程、服务 |
| 4. /etc/rc.common(老版本有) | 系统启动脚本(很少改动) |
| 5. launchd 加载 plist 配置 | /System/Library/LaunchDaemons /Library/LaunchDaemons |
5.2. 用户登录后(图形界面登录)
| 阶段 | 加载内容 |
|---|---|
| 1. /etc/profile | 系统级环境变量(仅登录shell用) |
| 2. /etc/zshrc / /etc/bashrc | 全局 shell 配置(交互shell用) |
| 3. 用户登录项(系统设置 → 登录项) | 自动启动的 app |
| 4. LaunchAgents | /Library/LaunchAgents 和 ~/Library/LaunchAgents |
| 5. ~/.zprofile / ~/.bash_profile | 只在“登录Shell”时加载 |
你开机+登陆桌面后,并不会自动加载 ~/.zshrc,因为 zsh 只在你打开 Terminal 时才加载。
5.3. 开机不打开终端时,加载的核心文件是
| 作用 | 文件 |
|---|---|
| 系统初始化 | /System/Library/LaunchDaemons/*.plist |
| 用户级自动启动 | /Library/LaunchAgents/*.plist |
| 当前用户的启动项 | ~/Library/LaunchAgents/*.plist |
| 系统级登录shell(很少生效) | /etc/profile |
| 用户登录shell(只有“登录shell”才生效) | ~/.bash_profile, ~/.zprofile |
➡️ 你开机后“不开终端”的情况下:不会加载 ~/.zshrc
➡️ 你开机后“会加载 LaunchDaemons / LaunchAgents 相关配置”
➡️ /.bash_profile、/.zprofile 也只有“登录Shell”时才会用到
➡️ 开机启动的App、后台服务与Shell文件无关
| 你开机 | ➔ 系统加载 LaunchDaemons/LaunchAgents
| 登录桌面 | ➔ 加载用户登录项(App自动启动) |
| 打开终端 | ➔ 才会加载 .zshrc(zsh)、.bash_profile(bash)
6. 为什么没有打开过终端,之前写的go程序也会运行呢
“运行Go编写的程序”和“调用go编译器”是两回事
| 概念 | 是否需要Go环境 | 解释 |
|---|---|---|
| 运行go编写的程序(二进制文件) | ❌ 不需要go环境变量 | 因为程序已经编译成了本地可执行文件 |
| 用go命令编译/构建代码(go build、go run) | ✅ 需要go环境变量 | 需要找到go工具链 |
6.1. 你执行的是“Go编译后生成的二进制文件”
-
Go 是 静态编译语言,编译出来的二进制文件(如 myapp)是独立的。
-
执行这个二进制文件不需要go环境变量,也不需要GOPATH、GOROOT。
-
只要你执行的是:
./myapp
- 它只依赖操作系统(syscall、libc)就能跑。
6.2. 只有“用go命令”才需要go环境变量
- 比如:
go build main.go
go run main.go
- 这才会去找 GOROOT、GOPATH、PATH 里的go工具链。
6.3. 场景及情况
| 场景 | 结果 |
|---|---|
| 你写的 Go 程序编译后,双击或用 Automator/脚本调用 | ✅ 正常运行(二进制文件) |
| 你打开终端,手动执行 go build | 这时才会找go环境 |
| Finder / App 只管可执行文件本身 | 跟go命令无关 |
6.4. 验证一下
你可以试着把go编译器彻底删除:
which go
sudo rm -rf $(which go)
然后运行你编译好的二进制文件:
./my-go-program
会发现 ➔ 还能运行。
但是你再试试:
go build
这时候才会提示:
zsh: command not found: go
6.5. 一句话总结
运行Go写的程序 ≠ 运行Go命令
➔ 你运行的只是“编译好的二进制”,跟Go开发环境、GOROOT、.zshrc 完全没关系。
7 配置go、java、python环境变量实例
这里以go为里
7.1 下载go
打开go官网
All releases - The Go Programming Language
由于是手动配置环境,这里下载.pkg,安装的方式;而选择压缩包的方式。注意:这里注意你本机芯片的架构方式,我选择的是arm64

7.2 解压到指定目录
7.3 设置.zshrc文件
vim ~/.zshrc

保存退出,使环境变量生效
vim ~/.zshrc
3212

被折叠的 条评论
为什么被折叠?



