linux 用了好多年,今天在安装 pyenv 的时候,老版本环境变量是放到~/.bashrc下面,而新版本是放在 ~/.bash_profile里,突然发现用了这么多年linux,然而这两个目录的区别,我不知道,有点尴尬。
经过查阅,做出以下分享,供他人阅读,自己谨记。
当我们在bash 里面配置的别名,当我们退出bash后,或者我们重启系统后,shell 别名就不生效了。很多在shell 命令行下定义的变量,别名他的生命周期只是当前shell进程,如果想突破这个生命周期,我们就需要想办,把配置信息写入到配置文件当中。
bash 的配置文件分为两大类:
-
profile 类
-
bashrc类
两大类都有什么作用,我们来分析一下。
profile类:
为交互式登陆的shell进程提供配置
什么是交互式登陆进程?
1.像我们登陆linux 操作系统,直接通过某终端输入账号密码后登陆打开的shell进程,这样的交互方式就是交互式登陆进程。
2.使用su命令 su - username, 或者使用 su -l username 执行的登陆切换
bashrc类:
为非交互式登陆的shell进程提供配置
su username 执行的登陆切换
在图形界面下打开的终端 也是非交互式登陆。
运行脚本的时候。
运行脚本时我们不难发现,直接使用一个bash来运行脚本,shell 脚本的运行,是通过一个子shell进程实现的。
了解以上信息,我们就来讲讲这两大类的区别:
profile 类:
对于profile来讲,主要分为两类:
全局:对所有用户都生效,
/etc/profile这个配置文件已经 /etc/profile.d/所有以.sh结 尾的配置文件。
/etc/profile.d/*.sh
功能作用:
1.用来定义环境变量。
我们以前提到过,环境变量,在shell当中运行,当前shell 终止,当前环境变量就无效了。所以,我们要把环境变量放到配置文件当中。只要用户一启动,环境变量自动运行,一直有效。
2.用于运行命令,或者脚本。
我们打算用户登陆时,运行一个命令或者脚本,就直接运行一个初始化命令,或者一个初始化脚本,就通过profile类配置文件来实现,
很多大的配置文件都能够切割成主配置文件和众多片段,放在什么什么.d目录下,以 .conf结尾或者.sh结尾等等,像这个样子,等我们将来管理其中的某一个片段话配置时,我们只需要更改一个片段,或者删除一个片段就可以。所以这样能够做到将来在配置方面非常容易实现,
用户个人:
只对当前用户生效,这里和哪个用户相关,就对哪个用户生效。
~/.bash_profile
bashrc类:
全局:对所有用户生效
/etc/bashrc
用户个人:只对个人生效的
~/.bashrc
功能作用:
1.定义本地变量。
定义一个本地变量,并且一直有效,那么我们就定义在bashrc中。
2.定义命令别名。
定义一个命令别名,也在bashrc中,那么我们问一下,我想定义一个本地变量,想让他一直有效,是定义在全局里还是个人里。看个人需要,主要是看是否让所有人有效,如果只想对当前用户有效,话又说回来,只有管理员才有权限定义全局。因为全局配置文件,普通用户是没有权限去编辑的。
我们上面讲了这么多配置文件,哪个先生效,哪个后生效呢,下面我们来讲一下配置文件读取次序:
交互式登陆shell进程顺序:
/etc/profile ---> /etc/profile.d/* ---> ~/.bash_profile ---> ~/.bashrc ---> /etc/bashrc
非交互式登陆shell 进程顺序:
~/.bashrc ---> /etc/bashrc ---> /etc/profile.d/*