理解 bashrc profile 优先级及区别
为使Bash更好地为我们服务,我们需定制bash shell环境。
~/.bash_profile、~/.bashrc、和~/.bash_logout
- 上面这三个文件是bash shell的用户环境配置文件,位于用户的主目录下。其中.bash_profile是最重要的一个配置文件,它在用户每次登录系统时被读取,里面的所有命令都会被bash执行。.profile(由Bourne Shell和Korn Shell使用)和.login(由C Shell使用)两个文件是.bash_profile的同义词,目的是为了兼容其它Shell。在Debian中使用.profile文件代替.bash_profile文件。如果 ~/.bash_profile文件存在的话,一般还会执行 ~/.bashrc文件。
- .bashrc文件会在bash shell调用另一个bash shell时读取,也就是在shell中再键入bash命令启动一个新shell时就会去读该文件。这样可有效分离登录和子shell所需的环境。但一般来说都会在.bash_profile里调用.bashrc脚本以便统一配置用户环境。
- .bash_logout在退出shell时被读取。所以我们可把一些清理工作的命令放到这文件中。
/etc/bashrc和/etc/profile是系统级(全局)的配置文件,当在用户主目录下找不到.bash_profile 和.bashrc时,就会读取这两个文件。.bash_history是bash shell的历史记录文件,里面记录了你在bash shell中输入的所有命令。可通过HISTSIZE环境变量设置在历史记录文件里保存记录的条数。
- /etc/profile:是全局profile文件,设置后会影响到所有用户
- /home/
/.profile或.bash_profile是针对特定用户的,可以针对用户,来配置自己的环境变量。
当我们修改了这些配置件后,可用source .bash_profile
命令使它修改内容马上生效。登录放到方式不同,使用的用户配件信息也不一样。
登录shell的类型:交互式登录和非交互式登录
交互式登录shell:
就是可以与shell进行交互,需要验证的登录。有:
1,通过控制台或远程连接,需要用户名,密码。
2,su - username(可看做交互式登录)
交互式登录依次读取的文件为:/etc/profile–>/etc/profile.d/*–>(~/.bash_profile | ~/.bash_login | /.profile)–>/.bashrc–>/etc/bashrc–>~/.bash_logout
这几种文件的作用分别是:
1,/etc/profile:当用户登录系统后,通常使用这个文件给给用户提供默认的环境。这个默认环境实际上就是一组环境变量的定义,最后会调用/etc/profile.d中的文件。文件作用于全部用户。文件中的各环境变量的意思如下:
- PATH:根据UID设定PATH要不要到含有sbin的系统命令目录
- USER:根据当前登陆用户名设置。
- MAIL:根据用户账号设置当前用户的邮件存放目录。
- HISTSIZE:是指保存历史命令记录的条数。
- LOGNAME:是指当前用户的登录名。
- HOSTNAME:内容是/bin/hostname,如果要用到主机名的话,通常是从这个环境变量中来取得的。INPUTRC:如果用户没有自定义输入的按键功能,则设置INPUTRC=/etc/inputrc,此文件定义bash的热键等数据,有的话就不设置。
2,/etc/profile.d:主要是对shell的设置,作用于全部用户。其中,这个目录文件中有一个lang.sh脚本会调用文件/etc/sysconfig/i18n,这是一个觉得我们bash默认使用何种语系的重要配置文件,文件中重要的是LANG变量的设置。
3,/.bash_profile:当用户登录时,该文件仅仅执行一次,默认情况下,他设置一些环境变量,执行用户的.bashrc文件,作用于当前用户。如果这个文件不存在会读取/.bash_login,这个文件还不存在的话读取~./profile。
4,~/.bashrc: 当用户登录时以及每次打开新的shell时,该该文件被读取。存有改用户的的所有的命令别名等;作用于当前用户。
5,/etc/bashrc:为运行bash shell的用户执行此文件,对bash进行设置.当bash shell被打开时,该文件被读取。作用于所有用户。
6,~/.bash_logout:当用户退出bash时读取该文件,执行一些操作。作用于当前用户。
登录shell:会首先读取和执行/etc/profile全局配置文件中的命令,然后依次查找/.bash_profile、/.bash_login 和 ~/.profile这三个配置文件,读取和执行这三个中的第一个存在且可读的文件中命令。除非被--noprofile
选项禁止了。
非交互式登录shell:
就是用户获取shell后,一次性读取全部文件,不与用户进行交互。例:
1,su username(可看做非交互式shell)
2,执行脚本的shell
3,图形界面下打开的模拟shell
非交互式登录依次读取的文件为: ~/.bashrc–>/etc/bashrc–>/etc/profile.d/*
各文件对用户shell登录的作用和交互式登录时的作用相同(需要说明的是./bashrc文件会调用/etc/bashrc文件)
交互非登录式shell:
比如启动了一个bash shell而没有登入系统(如在CLI提示符中键入bash),或者Linux通过图形界面进入的终端。
只读取 ~/.bashrc 和 /etc/bashrc 文件。交互式非登录shell执行~/.bashrc文件中的命令在每次执行shell脚本时,都会重新读取这个文件,所以是最完整的。
不同的发行版里面可能有所不同,比如debain系列的是不同的,如ubuntu /etc/profile–>/etc/environment–>$HOME/.profile
非登录非交互式Shell:
比如一个crontab脚本、shell脚本、ssh 执行远程命令都是非登录非交互式Shell,没经过处理的话,既不是交互式Shell,也不是登录Shell,所以上不会执行 profile ,也不会执行 rc。怎么解决?比如可以把Sha-Bang改成#!/bin/bash -l
变成登录式,让脚本用登录Shell来解释执行,就可以加载/etc/profile或者,调用Bash解释器,加-l
参数也可以。
区别
profile
profile 是某个用户唯一的用来设置环境变量的地方,因为可能有多个 shell 比如 bash 或者 zsh,但环境变量只需要统一初始化就行,这就是 profile 的作用
bashrc
用来给 bash 做初始化的,bash 的代码补全,bash 的别名,bash 的颜色,以此类推也就还会有 shrc, zshrc
通常一个好的做法是
- /etc/profile 是配置所有用户的
- ~/.profile 中配置和 bash 命令不是直接相关的内容,比如环境变量等等
- ~/.bashrc 中配置和交互式命令行相关的配置,比如命令自动补全,EDITOR 变量,bash aliases 别名等等
- ~/.bash_profile 可以当做 ~/.profile 使用,只会被 bash 读取
不同类型shell的影响
对用户来说,shell的分类带来的最大影响莫过于启动时的配置了。
以bash为例,如果它作为登录shell运行,例如用户登录系统时,则会首先读取并执行/etc/profile里的命令。 接下来,它按下面的顺序寻找并读取启动配置文件:/.bash_profile、/.bash_login、~/.profile,遇到第一个存在且可读的就不再继续了。在bash作为登录shell退出时, 它还会读取并执行~/.bash_logout和/etc/bash.bash_logout中的内容。反之,如果bash以非登录shell运行,例如用户启动终端程序或运行脚本时,它就不会读取上述那些文件。
非登录shell读取哪些配置文件还取决于它交互的还是非交互的。启动一个交互终端时,bash会读取并执行它的运行控制(run control)文件,默认为~/.bashrc。 而运行脚本时由于是非交互的,上面那些文件都不会起作用,bash会转而读取并执行环境变量BASH_ENV指示的文件。
Bash之外的其他shell,具体执行细节可能有所差异,但基本符合一些大原则:登录shell会读取带profile、login关键字的配置文件,非登录的交互shell会读取带rc关键字的运行控制文件, 非登录的非交互shell只会根据env关键字的变量来进行初始化。
在使用shell的过程中,有时会奇怪为啥自己增加的启动代码没有起作用。这很可能是因为这些代码写在了一个当前shell实例根本不会去读取的文件里。 知道了shell的种类和不同种类shell的影响,就可以有的放矢地配置和使用shell了。