Mac和Ubuntu系统下.bash_profile和.bashrc文件

本文探讨了Mac和Ubuntu系统中.bash_profile与.bashrc的区别。loginshell启动时执行.bash_profile,而非loginshell启动时执行.bashrc。文中详细介绍了这两种shell的启动场景及其配置建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Mac和Ubuntu系统下.bash_profile和.bashrc文件

本文部分参考Josh Staiger文章。


前言

我平时使用Ubuntu或者Mac。当设置shellPATH 或者其他环境变量时,你可以放在.bashrc.bash_profile其中的任何一个文件里,如果文件不存在你还可以创建一个,但是两个文件的启动有何区别?

以Ubuntu为例.bash_profilelogin shell 启动时执行而.bashrcnon-login shell 启动时执行。(Mac 情况不同,后文提到)


login shellnon-login shell

login shell

用户登录(输入用户名密码)时打开的shell,就叫做login shell。用户登录主要分三种:
命令行登录
依次寻找下面三个文件。

~/.bash_profile
~/.bash_login
~/.profile

需要注意的是,这三个文件只要有一个存在,就不再读入后面的文件了。

ssh登录
和命令行登录情况相同

图形界面登录
只加载 /etc/profile~/.profile。也就是说,~/.bash_profile 不管有没有,都不会运行。

non-login shell

用户进入操作系统以后,常常会再手动开启一个shell。这个shell就叫做 non-login shell,意思是它不同于登录时出现的那个shell,不读取/etc/profile.profile等配置文件。

non-login shell会读入用户自己的bash配置文件 ~/.bashrc。大多数时候,我们对于bash的定制,都是写在这个文件里面的。


为什么需要两种不同文件

比如你想在登录时打印一些电脑诊断信息(内存使用,在线用户等等)。你只想在每次登录的时候看到,所以将相关代码写入.bash_profile 如果你写入.bashrc 则你每次打开terminal都会打印这些信息。


Mac例外

Mac的Terminal打开的每个新shell默认为login shell只加载.bash_profile。而且,不管是ssh登录,还是在图形界面里启动shell窗口,都是如此。

建议

将下面的脚本加入.bash_profile

if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi

注:第二行开头的那个点,是source命令的简写形式,表示运行某个文件,写成source ~/.bashrc也是可以的。[ -f ~/.bashrc ] 中括号内侧有空格。

这样执行.bash_profile 时也会执行.bashrc

<think>嗯,用户问的是.bash_profile.bashrc的区别,以及配置环境变量时应该用哪个文件,特别是用户登录时需要加载的情况。我得先理清楚这两个文件的作用它们被调用的时机。 首先,我应该回忆一下Bash shell的不同类型:登录shell非登录shell,以及交互式非交互式的区别。这两个文件在不同的情况下会被读取。比如,当用户通过终端登录或者使用ssh登录时,会启动登录shell,这时候会读取.bash_profile。而每次打开新的终端窗口(比如在图形界面中),如果启动的是非登录shell,可能会读取.bashrc。 接下来,需要确认.bash_profile.bashrc的具体用途。通常,.bash_profile用于登录时的配置,比如设置环境变量PATH,或者启动一些只在登录时需要运行的程序。而.bashrc则用于每次启动新的shell时的配置,比如别名(alias)函数定义,这些可能在每个新终端中都需要。 然后,用户的问题是关于配置环境变量,特别是登录时加载。这时候应该推荐使用.bash_profile,因为它只在登录时执行一次。但需要注意的是,有些系统或者发行版(比如某些Linux发行版)可能会在.bash_profile中显式调用.bashrc,这样环境变量可能也会在每次启动shell时被加载。这时候可能需要用户检查他们的.bash_profile是否存在这样的调用,比如是否有source ~/.bashrc这样的行。 另外,有些情况下,用户可能没有.bash_profile,这时候Bash会转而读取.bash_login或者.profile。不过通常建议使用.bash_profile,因为它是Bash特定的配置文件。 可能用户会遇到的问题是,如果他们错误地将环境变量配置在.bashrc里,那么每次打开终端都会加载,这可能在某些情况下导致变量被重复设置,或者在非交互式shell中被加载,这可能不是他们想要的。因此,需要明确区分两者的使用场景。 总结起来,回答应该分点说明两者的区别,调用时机,适用场景,并给出具体的配置建议。同时提醒用户注意不同系统的差异,以及检查现有配置文件中的内容,比如是否存在对.bashrc的调用,以避免重复加载。</think>### 分步解析: 1. **核心区别** - `.bash_profile`:**登录Shell**配置文件 $$ \text{适用场景:用户通过终端登录/SSH登录时} $$ - `.bashrc`:**交互式非登录Shell**配置文件 $$ \text{适用场景:新开终端窗口/启动子Shell时} $$ 2. **加载机制对比** | 文件 | 触发条件 | 执行频率 | 典型用途 | |---------------|---------------------------|----------------|----------------------------| | `.bash_profile`| 系统登录(如SSH/终端登录) | 仅一次 | 设置环境变量、启动服务 | | `.bashrc` | 打开新终端/创建子Shell | 每次新Shell | 定义别名、函数、临时变量 | 3. **如何选择** - ✅ **登录即加载环境变量** → 用 `.bash_profile` 例如: ```bash export JAVA_HOME=/usr/lib/jvm/java-11-openjdk export PATH=$PATH:$JAVA_HOME/bin ``` - ❌ 避免在 `.bashrc` 中设置环境变量 → 否则每次新终端都会重复加载 4. **重要补充** 部分Linux发行版(如Ubuntu)的 `.bash_profile` 会显式调用 `.bashrc`: ```bash if [ -f ~/.bashrc ]; then . ~/.bashrc fi ``` **此时环境变量可统一写在 `.bashrc` 中**,但需注意: - 图形界面终端可能默认以非登录Shell启动 - 验证方法:执行 `echo $BASH_VERSION` 查看是否加载配置 5. **终极验证命令** ```bash # 登录Shell测试 bash --login # 检查变量是否生效 echo $YOUR_VARIABLE ``` ### 总结建议: - **系统级环境变量** → 优先用 `/etc/profile` - **用户级登录配置** → 首选 `~/.bash_profile` - **多终端复用配置** → 通过 `.bash_profile` 调用 `.bashrc` 实现级联加载
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值