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

浙公网安备 33010602011771号