Shell运行环境之环境变量介绍了 Shell 运行环境中三种不同的环境变量--临时变量,用户变量和系统变量,除此之外还有 /etc/environment, /etc/profile 和 ~/.profile 作用域。这篇文章将主要围绕 Bash 这个 Shell来讲解环境配置文件,并结合 Shell 的四种模式来说明这些配置文件的作用域。 <!--more-->
简介
我们知道 Linux 系统中有很多 Shell,像最常用的 Bash,不常用的 sh,zsh 等。而对于它们公共的变量我们不可能为每个 Shell 重复设置,所以这些公共变量我们将会保存在 profile 中,而对于每个 Shell 个性化的配置将会放在各自的配置文件中,像 bashrc, shrc 和 zshrc。而Ubuntu 默认用的是 Bash, 所以只有 bashrc 而没有其他吧。
profile配置文件
profile 是配置的意思,是某个用户唯一用来设置环境变量的地方,而用户可用的 Shell 有多个,像 bash, sh, zsh 之类的,但像环境变量这种只需要在统一的一个地方初始化就可以了,这就需要 profile。在 Ubuntu 中 将在用户第一次登录(可以是图形也可以是终端)时被执行,其只做两件事。
- 设置 Shell 使用 bash(主要执行 /etc/bash.bashrc)
- 查看 /etc/profile.d 中是否有相应的环境变量要设置(该文件夹中每个 sh 文件都是针对某个应用设置的环境变量)。
而 也是在用户第一次登录时被执行,其也是做两件事。
- 设置 Shell 使用 bash(主要执行 ~/.bashrc )
- 设置路径包含用户私有的执行文件目录(如果存在)
bashrc配置文件
bashrc 看名字就知道,是专门用来给 bash 做初始化的。像初始化 bash 的设置,代码补全,别名,颜色等。同理,还会有 shrc, zshrc 这样的文件存在,只是 bash 太常用了。在 Ubuntu 系统中,每次打开 bash, 就会被执行,进行如下设置。
- 非交互模式则不进行下面的操作
- 窗口可调整
- 增强
$PS1
- 设置 xterm (注释掉了)
- 交互模式中开启命令补全(注释掉了)
- 在 bash 中使用 sudo
- 安装 command-not-found 包后 bash 的变化
而 中设置的就比较多了,具体可以看文档注释。
四种不同的shell模式
登录模式
进入登录模式的 Shell 需要一个特定的用户名和密码,就像我们按 Ctrl + Alt + F1
进入 tty1 后输入用户名和密码后成功登录系统的情况。
非登录模式
非登录模式是指不用登录直接进入 Shell,它需要在特定用户登录状态下才能进入。就像在终端下直接输入 bash
或 bash -c 'CMD'
。
交互模式
在交互模式的 Shell 中,标准输入,输出和错误都显示在终端上,此时变量 $PS1
一定会被设置。像以 bash
, bash -i
命令启动。
非交互模式
非交互模式就是指 Shell 里面没有交互,像执行命令 bash -c 'CMD'
,像运行 Shell 脚本等。
验证配置文件的作用域
前期准备
当我们在终端中执行 bash 命令的时候,它其实在终端中又开了一个外壳,所以我们需要 exit
两次才能退出。所以我们在第一层外壳中设置四个配置文件中变量。设置如下:
# /etc/profile
export epro='I am in /etc/profile'
export epro_ebash='I am in /etc/profile'
export epro_pro='I am in /etc/profile'
export epro_bash='I am in /etc/profile'
# /etc/bash.bashrc
export ebash='I am in /etc/bash.bashrc'
export epro_ebash='I am in /etc/bash.bashrc'
export ebash_pro='I am in /etc/bash.bashrc'
export ebash_bash='I am in /etc/bash.bashrc'
# ~/.profile
export pro='I am in ~/.profile'
export epro_pro='I am in ~/.profile'
export ebash_pro='I am in ~/.profile'
export pro_bash='I am in ~/.profile'
# ~/.bashrc
export bash='I am in ~/.bashrc'
export epro_bash='I am in ~/.bashrc'
export ebash_bash='I am in ~/.bashrc'
export pro_bash='I am in ~/.bashrc'
试验步骤
- 登录模式
在终端中设置完上面的变量之后,以bash -l
进入另一个 bash,并显示上面的变量值 - 交互模式
在终端中设置完上面的变量之后,以bash -i
进入另一个 bash,并显示上面的变量 - 打开终端时,进入的模式
在一个终端中设置完上面的变量后,打开另一个终端,显示上面的变量值
结论
- 登录模式中,四个文件都被执行了,执行的顺序是
/etc/profile > /etc/bash.bashrc > ~/.profile > ~/.bashrc
epro, pro, ebash, bash 都有值,说明四个文件都被执行了。epro_ebash 说明 /etc/profile 先于 /etc/bash.bashrc; ebash_pro 说明 /etc/bash.bashrc 先于 ~/.profile; pro_bash 说明 ~/.profile 先于 ~/.bashrc - 交互模式中,两个 profile 文件没有被执行,两个 bash 文件都被执行了,并且 /etc/bash.bashrc 比 ~/.bashrc 先执行
ebash, bash 都有值,说明 bash 两个文件都被执行了。ebash_bash说明 ~/.profile 先于 ~/.bashrc - 打开终端时,进入交互模式
两个 profile 文件没有被执行,两个 bash 文件都被执行了,并且 /etc/bash.bashrc 比 ~/.bashrc 先执行。此状态和交互模式的状态一致。
待解决的问题
- 非登录模式如何确定?
- 之前的所有试验其实都包含了交互模式。非交互模式又如何确定?
参考文献
如果该文章对您产生了帮助,或者您对技术文章感兴趣,可以关注微信公众号: 技术茶话会, 能够第一时间收到相关的技术文章,谢谢!
本篇文章由一文多发平台ArtiPub自动发布