Linux- 环境变量和自定义配置
环境变量查看
- 查看当前用户的全部环境变量:
env
,可以结合env | grep
筛选信息 - 查看当前系统的全部环境变量:
export
- 查看指定环境变量:
printenv $env_name
或者echo $env_name
- 清除指定环境变量的值:
unset $env_name
常用环境变量
- PATH
- 可执行程序的搜索目录,可执行程序包括 Linux 系统命令和用户的应用程序。如果可执行程序的目录不在 PATH 指定的目录中,执行时需要指定目录。
- PATH 环境变量存放的是目录列表,目录之间用冒号: 分隔,最后的圆点.表示当前目录。
PATH=dir1:dir2:dir3:…dirn:.
- 添加环境变量:
export PATH=$PATH:$HOME/bin
或export PATH=$HOME/bin:$PATH
,其中$PATH
表示现有环境变量 - PATH 缺省包含 Linux 系统命令所在目录(
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin
),如果不包含这些目录,Linux 的常用命令也无法执行(要输入绝对路径才能执行)
- HOME:指定用户的主工作目录(即用户登陆到 Linux 系统中时,默认的目录)。
- PWD:显示当前目录。
- SHELL:当前用户用的是哪种 Shell。
- HISTSIZE:保存历史命令记录的条数。
- HOSTNAME:主机的名称,应用程序如果要用到主机名的话,通常是从这个环境变量中取得。
- LOGNAME:当前用户的登录名。
- LANG/LANGUGE:和语言相关的环境变量,使用多种语言的用户可以修改此环境变量。
系统配置文件
可以通过命令行 export ENV_NAME=xxxx
(如 export CUDA_VISIBLE_DEVICES=0,2
,注意等号两边没空格)的方式设置临时环境变量,但是如果需要临时变量永久生效,或者需要进行一些系统的自定义配置,则需要修改下面的一些配置文件 (source
命令的缩写是 .
)。
/etc/profile
- 为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行。并从
/etc/profile.d
目录的配置文件中收集 shell 的设置并执行。 - 修改后需要手动执行
source /etc/profile
才会开始生效。 - 修改对每个用户都生效。
- 为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行。并从
/etc/profile.d
-
/etc/profile
在每次启动时会执行/etc/profile.d
下全部的脚本文件。 - 推荐将系统自定义配置以脚本的形式放入此目录。👍
-
/etc/bashrc
或者/ect/bash.bashrc
(Ubuntu)- 为每一个运行终端的用户执行此文件。
- 当终端被打开时,该文件被读取开始生效。或者手动执行
source /etc/bashrc
开始生效。 - 修改对每个用户都生效。
~/.bash_profile
|~/.bash_login
|~/.profile
- bash 的 login shell 设定只会读取上面三个文件的其中一个,而读取的顺序则是依照上面的顺序(
~/.bash_profile > ~/.bash_login > ~/.profile
,~/.bash_profile
)。也就是说,如果~/.bash_profile
存在,那么其他两个文件不论有无存在,都不会被读取。如果~/.bash_profile
不存在才会去读取~/.bash_login
,而前两者都不存在才会读取~/.profile
的意思。会有这么多的文件,其实是因应其他 shell 转换过来的使用者的习惯而已。如 centos 中为~/.bash_profile
,ubuntu 则为 ` ~/.profile - 读取时,会判断家目录下的
~/.bashrc
存在否,若存在则读入~/.bashrc
的设定 - 当用户登录时,该文件执行并开始生效(因为是 login shell)。修改后需要手动执行
source xxx
才会开始生效。 - 修改对当前用户有效,推荐用来进行用户个人自定义配置。
- bash 的 login shell 设定只会读取上面三个文件的其中一个,而读取的顺序则是依照上面的顺序(
~/.bashrc
- bash 的 non-login shell 设定会读取执行
~/.bashrc
,~/.bashrc
执行时会读取/etc/bashrc
及/etc/profile.d/*.sh
。如果误删了该文件,可以复制/etc/skel/.bashrc
到家目录,再重新添加自定义配置即可 - 当终端被打开时,该文件被读取开始生效(因为是 non-login shell)。或者手动执行
source ~/.bashrc
在当前 shell 生效。 - 修改对当前用户有效,推荐用来进行用户个人自定义配置。👍
- bash 的 non-login shell 设定会读取执行
~/.bash_history
- 预设的情况下,历史命令就记录在这里,而这个文件能够记录多少条数据,则与 HISTFILESIZE 这个环境变量有关。每次登入 bash 后,bash 会先读取这个文件,将所有的历史指令读入内存,因此,当我们登入 bash 后就可以查知上次使用过哪些指令
~/.bash_logout
- 这个文件记录了『当我注销 bash 后,系统再帮我做完什么动作后才离开』的意思。预设的情况下,注销时, bash 只是帮我们清掉屏幕的讯息而已。不过,你也可以将一些备份或者是其他你认为重要的工作写在这个文件中 (例如清空暂存盘),避免每次机械重复操作。
配置文件的读取顺序
不同系统的配置文件执行顺序不太一样,而且一般是某个文件中去调用执行另一个文件,而不是顺序的一个个执行。整体规律是:
- 系统配置文件作用于全局,而用户配置文件仅针对当前登录的用户
- 先读取系统配置文件,再读取用户配置文件,用户配置文件的变量和表达式等都继承自系统配置文件
以 CentOS 为例,执行顺序一般如下:
登录 shell 方式进入 Linux (login shell)
执行顺序:账号和密码——>/etc/profile
(全局文件 G1)——>/etc/profile.d/
(全局脚本目录 F1)——> ~/.bash_profile
| ~/.bash_login
| ~/.profile
(用户文件 U1)——> ~/.bashrc
(用户文件 U2)——>/etc/profile.d/
(全局脚本目录 F1)——>/etc/bashrc
(全局文件 G2)
解释: 当用户登录 Linux 系统时,Shell 会作为登录 Shell 启动,此时的登录 Shell 加载环境变量的顺序如上。 用户登录系统后首先会加载 /etc/profile
全局环境变量文件,这是 Linux 系统上默认的 Shell 主环境变量文件,系统上每个用户登录都会加载这个文件。 当加载完 /etc/profile
文件后,才会执行 /etc/profile.d/
目录下的脚本文件,这个目录下的脚本文件由很多,例如:系统的字符集设置(/etc/sysconfig/i18n
)等,以便用户登录后即可运行脚本 之后开始运行 ~/.bash_profile
| ~/.bash_login
| ~/.profile
(用户环境变量文件),在这个文件中,又会去找 ~/.bashrc
(用户环境变量文件),如果有,则执行,如果没有,则不执行,在 ~/.bashrc
文件中又会去找 /etc/profile.d/
(全局脚本目录 F1)和 /etc/bashrc
(全局环境变量文件),如果有,则执行,如果没有,则不执行。
注意:在 Ubuntu 系统中,通过在每个配置文件开始和结尾加上提升语发现,其执行顺序如下(注意,一般是某个文件中去调用执行另一个文件,而不是顺序的一个个执行),即先读取执行 /etc/profile
期间读取执行 /etc/bash.bashrc
;然后再读取执行 ~/.profile
,期间读取执行 ~/.bashrc
,基本规律是先系统级配置,后用户级配置。
/etc/profile start
/etc/bash.bashrc start
/etc/bash.bashrc end
/etc/profile end
~/.profile start
~/.bashrc start
~/.bashrc end
~/.profile end
非登录 Shell 方式进入 Linux
执行顺序:不需要输入密码的登录及远程 SSH 连接——> ~/.bashrc
(用户文件 U2)——>/etc/bashrc
(全局文件 G2)
解释:如果用户的 Shell 不是登录时启动的(比如手动敲下 bash 时启动或者其他不需要输入密码的登录及远程 SSH 连接情况)那么这种非登录 Shell 只会加载 ~/.bashrc
(用户环境变量文件),并会去找 /etc/bashrc
(全局环境变量文件),因此如果希望在非登录 Shell 下也可读到设置的环境变量等内容,就需要将变量设定写入 ~/.bashrc
或者 /etc/bashrc
,而不是 ~/.bash_profile
或 /etc/profile
。
注意:在 Ubuntu 系统中,打开非登录 shell 时的配置文件执行顺序是: 读取执行 ~/.profile
,期间读取执行 ~/.bashrc
补充知识
login 与 non-login shell
- login shell:取得 bash 时需要完整的登入流程的,就称为 login shell。举例来说,你要由 tty1 ~ tty6 登入,需要输入用户的账号与密码,此时取得的 bash 就称为『 login shell 』啰; ^wx6qht
- non-login shell:取得 bash 接口的方法不需要重复登入的举动,举例来说,(1) 你以 X window 登入 Linux 后,再以 X 的图形化接口启动终端机,此时那个终端接口并没有需要再次的输入账号与密码,那个 bash 的环境就称为 non-login shell 了。(2) 你在原本的 bash 环境下再次下达 bash 这个指令,同样的也没有输入账号密码,那第二个 bash (子程序) 也是 non-login shell 。 ^7y1cj1