.profile 和 .bashrc

之前很长一段时间对 /etc/profile /etc/bash.bashrc(在 Centos 中是 /etc/bashrc) .profile.bashrc 之间的关系一直不甚了解. 所知道的仅限于在用户打开终端时执行任何操作之前会调用这几个文件中的几个。如果需要设置环境如 PATH 变量,设置命令别名,只需要往 .profile 或者 .bashrc 写入即可。不过如果没有理解这四者之间的关系,在缺乏必要的文件时会出现修改不生效的尴尬情况。比如命令行提示符仅出现 -bash4.1 $,在修改 .bashrc 后却不生效的情况。

在描述之前需要了解什么是 login 和 non-login shell? login shell 在取得 bash 时需要经历完整的登陆流程,通常需要输入用户的账号和密码。比如常用的 ssh , su - 以及终端 login 提示符。而 non-login shell 则是取得 bash 接口时不需要重复登录的举动。举例来说就是 X window 登录 Linux 后,再以 X 的图形界面启动终端机时就是 non-login shell了。

基本上 login shell 会依次调用 /etc/profile~/.profile 两个文件。其实在用户目录下有三个 profile 文件,分别是 ~/.bash_profile ~/.bash_login ~/.profile ,login shell 会依次去寻找这些文件,当找到第一个之后并执行,剩余的文件不论存在与否将不再执行。就是说仅在 ~/.bash_profile 不存在的情况下才会去寻找 ~/.bash_login,而前两者都不存在的情况下才会读取 ~/.profile 的意思。

而 ~/.bashrc 仅仅会在打开交互(interactive)和非登录(non-login) shell 时才会执行,**如果是调用 bash 执行脚本文件是不会触发上面任何文件的调用。**在 Ubuntu 中 /etc/profile 会主动调用 /etc/bash.bashrc 而在 Centos 中没有主动去调用 /etc/bashrc ,可能在 Centos 中需要修改 .bashrc 去调用 /etc/bashrc 。而在大部分的 Linux 系统中 .profile 都会去调用 .bashrc 文件。下面简单列举这几个文件之间的调用情况:

1
2
3
4
# /etc/profile in Ubuntu
if [ -f /etc/bash.bashrc ]; then                                                
  . /etc/bash.bashrc
fi
1
2
3
4
# ~/.profile in Ubuntu and Centos
if [ -f "$HOME/.bashrc" ]; then
    . "$HOME/.bashrc"                                                           
fi
1
2
3
4
# ~/.bashrc in Centos
if [ -f /etc/bashrc ]; then
   . /etc/bashrc
fi

通过以上的调用就将这 4 个文件连接起来了,而添加环境变量等预设操作都可以在 ~/.bashrc 中完成。在有些系统中可能没有 ~/.profile~/.bashrc 文件,这时候就需要手动添加了。

上面说到的 Linux 命令行提示符是由变量 PS1 决定的,这个变量的设置在 /etc/bashrc 中,Ubuntu 中为 '\u@\h:\w\$ ' Centos 中为 '[\u@\h \W]\$ ' 其中 \u 为用户名 \h 为主机名 \w 为当前目录 \$ 如果为普通用户显示为 $ 如果为超级用户显示为 # .

既然说到这里就在顺便提一句,很多时候新部署的服务器是没有设置语言为 UTF8 编码的,导致出现很多乱码的现象,可以通过 locale 查看当前的语言设置,而在 .bashrc 中添加如下代码可以设置成 UTF8 编码。

1
2
3
export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8

(完)