一. 系统环境变量位置
在上章中, 知道了如何修改系统环境变量, 如 PATH 变量, 以及创建自己的全局环境变量和局部环境变量. 这篇学习怎么让环境变量的作用持久化. 在此之前, 先了解下系统环境变量文件会在哪些位置, 当使用 bash shell 时, bash 是如何查找环境变量位置的. 下面先来介绍几个文件, 这些文件叫启动文件或叫环境文件.
bash 检查的启动文件 (环境文件) 取决于你启动 bash shell 的方式. 启动 bash shell 有 3 种方式:
(1) 登录时的默认登录 shell.
(2) 交互式 shell.
(3) 运行脚本的非交互式 shell.
1.1 登录 shell
登 6shell 是指:(1) 用户登 6 时, 输入用户名和密码后启动的 shell(例如使用 ssh 登录远程主机等);(2) 通过带 --login 参数的命令: bash --login 而启动的 shell. 当登录 linux 系统时, bash shell 作为登录 shell 启动, 登录 shell 会从 5 个不同的启动文件里读取命令. 包括:/etc/profile, $HOME/.bash_profile, $HOME/.bashrc, $HOME/.bash_login, $HOME/.profile. 而 / etc/profile 文件是系统默认的 bash shell 的主启动文件. 另外 4 个启动文件是针对用户的(不同发行版中, 四个启动文件一般都只有一到二个), 可根据个人需求定制.
(1) /etc/profile 文件
只要登录了 linux 系统, bash 就会执行 / etc/profile 启动文件中的命令(不同发行版的 / etc/profile, 有不同的设置和命令),profile 文件内容如下图所示:
profile 文件内容太长, 截取了一段. 上图有个 for 语句, 它用来循环读取 / etc/profile.d 目录下的所有文件. 该文件目录包含以下文件, 如下图所示:
上图启动文件中 sh 后缀的供 bash shell 使用, csh 后缀的供 c shell 使用. lang.csh 和 lang.sh 文件会尝试去判定系统上采用的默认语言字符集. 对应 LANG 环境变量.
(2) $HOME 目录下的启动文件
HOME 目录下的隐藏文件, 找到了 $HOME/.bash_profile, $HOME/.bashrc. 每个用户都可以编辑这些文件添加自己的环境变量, 这此环境变量会在每次启动 bash sehll 会话时生效. HOME 目录如下图所示:
.bash_profile 启动文件会先去检查 HOME 目录下是不是有一个叫. bashrc 的启动文件, 如果有就会先执行里面的命令. bash_profile 文件内容如下图所示:
上图中, 可以看到在. bash_profile 文件中给 PATH 变量添加了一个目录路径, 并用 export PATH 导入到全局中. 在. bash_profile 文件中加的变量可以持久化.
1.2 交互式 shell 进程
交互式 shell 是指: 就是在终端上执行, shell 等待你的输入, 并且立即执行你提交的命令. 命令行提示符输入命令, 只会检查用户 HOME 目录中的. bashrc 文件. 该文件两个作用: 1 是查看 / etc 目录下通用的 bashrc 文件, 2 是为用户提供一个定制自己的命令别名 (前面讲 alias 命令) 和私有脚本函数(后面介绍). .bashrc 文件内容如下图所示:
1.3 非交互式 shell
非交互式 shell 是指: 以 shell script(非交互)方式执行. 在这种模式下, shell 不与你进行交互, 而是读取存放在文件中的命令, 并且执行它们. 当它读到文件的结尾 EOF,shell 也就终止了. 系统执行 shell 脚本时用的这是这种 shell. 区别是它没有命令提示符. 但当你的系统上运行脚本时, 也许希望能够运行一些特定启动的命令.
为了处理这种情况 bash shell 提供了 BASH_ENV 环境变量. 当 shell 启动一个非交互式 shell 进程时, 它会检查这个环境变量来查看要执行的启动文件. 默认情况下并未设置该变量, 使用 printenv 命令只返回提示符:
正如上图所示: BASH_ENV 环境变量没有设置值. 这种非交互式 shell 一般通过启动一个子 shell 来执行. 如果父 shell 是登录 shell, 那么可以从 / etc/profile,/etc/profiled/*.sh 和 $HOME/.bashrc 文件中继承这些变量. 如果父 shell 中的变量是局部变量时, 那么子 shell 无法继承. 如果不启动子 shell, 变量已存在于当前 shell 中, 就算不设置 BASH_ENV, 也可以使用当前的局部和全局变量.
交互式与非交互式二者区别: 读取的配置文件不同, 交互式 bash 必然读取~/.bashrc 文件; 非交互式 bash 读取的是环境变量 BASH_ENV(通常情况下)所指定的配置文件.
二. 环境变量持久化
上面了解了各种 shell 进程对应的环境文件, 找出永久性环境变量就容易多了. 可以利用这些文件来创建自己的永久性全局变量或局部变量. 全局变量是对所有用户都需要使用的变量, 可以将新的变量或修改过的变量设置放在 / etc/profile 文件中, 但升级了发行版该文件也会更新, 所以这点要注意 (对所有用户).
最好是在 / etc/profile.d 目录中创建一个以. sh 结尾的文件, 把所有新的变量或修改过的变量全部放在此文件中(对所有用户).
对于存储个人用户永久性 bash shell 变量的地方是 $HOME/.bashrc 文件. 这一点适用于所有类型的 shell 进程(仅对当前用户).
下面来演示给 mysql 工具包路径, 添加到 PATH 全局变量中:
(1)在虚拟根目录下输入 mysqldump 工具, 提示未找到命令, 如下图所示:
(2)找到 mysqldump 工具包的位置, 路径是 / usr/local/mysql/bin. 如下图所示:
(3) 查看现有 PATH 的路径列表, 以冒号分隔的默认有 5 个路径. 如下图所示:
(4) 在 $HOME/.bash_profile 文件中加入一个 PATH 全局变量值, 路径为 / usr/local/mysql/bin. 如下图所示:
(5) exit 退出终端或 shutdown 后重新开机, 在虚拟根目录下输入 mysqldump 工具, PATH 设置的 mysql 工具包路径永久生效. 如下图所示:
再切换到 mysql 用户下, PATH 的设置也是生效的, 说明是跨用户生效的.
在 root 用户下, 使用子 shell, PATH 的设置也是生效的, 说明跨进程, 已设置成了全局变量.
(6) 最后在看下 PATH 路径,/usr/local/mysql/bin 已添加了
来源: https://www.cnblogs.com/MrHSR/p/9667058.html