一个计算机技术爱好者与学习者

0%

好好学Linux:bash_profile和bashrc的区别

1. bash_profile和bashrc是啥?

bash_profile和bashrc都是linux里的初始化脚本,作用是对shell环境进行初始化。在安装和配置软件的时候,经常需要修改这两个配置文件,以便每次登录自动生效或者每次执行脚本都自动生效。

这两个文件的区别是什么?它们有什么联系?什么情况下需要修改bash_profile?什么情况下需要修改bashrc?本文就来详细了解一下,主要引用阮一峰大佬的Bash 启动环境

2. Session

用户每次使用 Shell,都会开启一个与 Shell 的 Session(对话)。

Session 有两种类型:登录 Session 和非登录 Session,也可以叫做 login shell 和 non-login shell。

2.1. 登录 Session

登录 Session 是用户登录系统以后,系统为用户开启的原始 Session,通常需要用户输入用户名和密码进行登录。

登录 Session 一般进行整个系统环境的初始化,启动的初始化脚本依次如下。

  • /etc/profile:所有用户的全局配置脚本。
  • /etc/profile.d:目录里面所有.sh文件
  • ~/.bash_profile:用户的个人配置脚本。如果该脚本存在,则执行完就不再往下执行。
  • ~/.bash_login:如果~/.bash_profile没找到,则尝试执行这个脚本(C shell 的初始化脚本)。如果该脚本存在,则执行完就不再往下执行。
  • ~/.profile:如果~/.bash_profile~/.bash_login都没找到,则尝试读取这个脚本(Bourne shell 和 Korn shell 的初始化脚本)。

Linux 发行版更新的时候,会更新/etc里面的文件,比如/etc/profile,因此不要直接修改这个文件。如果想修改所有用户的登陆环境,就在/etc/profile.d目录里面新建.sh脚本。

如果想修改你个人的登录环境,一般是写在~/.bash_profile里面。下面是一个典型的.bash_profile文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# .bash_profile
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/bin
PATH=$PATH:$HOME/bin

SHELL=/bin/bash
MANPATH=/usr/man:/usr/X11/man
EDITOR=/usr/bin/vi
PS1='\h:\w\$ '
PS2='> '

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

export PATH
export EDITOR

可以看到,这个脚本定义了一些最基本的环境变量,然后执行了~/.bashrc

bash命令的 –login 参数,会强制执行登录 Session 会执行的脚本。
bash --login
bash命令的 –noprofile 参数,会跳过上面这些 Profile 脚本。
bash --noprofile

2.2. 非登录 Session

非登录 Session 是用户进入系统以后,手动新建的 Session,这时不会进行环境初始化。比如,在命令行执行bash命令,就会新建一个非登录 Session。

非登录 Session 的初始化脚本依次如下。

  • /etc/bash.bashrc:对全体用户有效。其中rc的含义是run commands
  • ~/.bashrc:仅对当前用户有效。

对用户来说,~/.bashrc通常是最重要的脚本。非登录 Session 默认会执行它,而登录 Session 一般也会通过调用执行它。每次新建一个 Bash 窗口,就相当于新建一个非登录 Session,所以~/.bashrc每次都会执行。

注意,执行脚本相当于新建一个非互动的 Bash 环境,但是这种情况不会调用~/.bashrc

bash命令的 –norc 参数,可以禁止在非登录 Session 执行~/.bashrc脚本。
bash --norc
bash命令的 –rcfile 参数,指定另一个脚本代替.bashrc
bash --rcfile testrc

2.3. bash_logout

~/.bash_logout脚本在每次退出 Session 时执行,通常用来做一些清理工作和记录工作,比如删除临时文件,记录用户在本次 Session 花费的时间。

如果没有退出时要执行的命令,这个文件也可以不存在。

3. 小结

  • 全局配置修改 /etc/profile/etc/profile.d/etc/bash.bashrc
  • 个人配置修改 ~/.bash_profile~/.bashrc
  • ~/.bash_profile登录session的初始化脚本,每次登录系统后都会执行它,它会调用bashrc。
  • ~/.bashrc是非登录session的初始化脚本,执行 bash 命令后进入新的bash环境时会执行它。
  • macos上的初始化脚本是~/.bash_profile,没有~/.bashrc
  • 一般情况下,修改~/.bash_profile即可,~/.bashrc修改较少。