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 才会开始生效。
    • 修改对当前用户有效,推荐用来进行用户个人自定义配置。
  • ~/.bashrc
    • bash 的 non-login shell 设定会读取执行 ~/.bashrc~/.bashrc 执行时会读取 /etc/bashrc/etc/profile.d/*.sh。如果误删了该文件,可以复制 /etc/skel/.bashrc 到家目录,再重新添加自定义配置即可
    • 当终端被打开时,该文件被读取开始生效(因为是 non-login shell)。或者手动执行 source ~/.bashrc 在当前 shell 生效。
    • 修改对当前用户有效,推荐用来进行用户个人自定义配置。👍
  • ~/.bash_history
    • 预设的情况下,历史命令就记录在这里,而这个文件能够记录多少条数据,则与 HISTFILESIZE 这个环境变量有关。每次登入 bash 后,bash 会先读取这个文件,将所有的历史指令读入内存,因此,当我们登入 bash 后就可以查知上次使用过哪些指令
  • ~/.bash_logout
    • 这个文件记录了『当我注销 bash 后,系统再帮我做完什么动作后才离开』的意思。预设的情况下,注销时, bash 只是帮我们清掉屏幕的讯息而已。不过,你也可以将一些备份或者是其他你认为重要的工作写在这个文件中 (例如清空暂存盘),避免每次机械重复操作。

配置文件的读取顺序

不同系统的配置文件执行顺序不太一样,而且一般是某个文件中去调用执行另一个文件,而不是顺序的一个个执行。整体规律是:

  1. 系统配置文件作用于全局,而用户配置文件仅针对当前登录的用户
  2. 先读取系统配置文件,再读取用户配置文件,用户配置文件的变量和表达式等都继承自系统配置文件

以 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

参考

posted @ 2023-05-16 23:08  凌晗  阅读(678)  评论(0编辑  收藏  举报