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 中 将在用户第一次登录(可以是图形也可以是终端)时被执行,其只做两件事。

  1. 设置 Shell 使用 bash(主要执行 /etc/bash.bashrc)
  2. 查看 /etc/profile.d 中是否有相应的环境变量要设置(该文件夹中每个 sh 文件都是针对某个应用设置的环境变量)。

而 也是在用户第一次登录时被执行,其也是做两件事。

  1. 设置 Shell 使用 bash(主要执行 ~/.bashrc )
  2. 设置路径包含用户私有的执行文件目录(如果存在)

bashrc配置文件

bashrc 看名字就知道,是专门用来给 bash 做初始化的。像初始化 bash 的设置,代码补全,别名,颜色等。同理,还会有 shrc, zshrc 这样的文件存在,只是 bash 太常用了。在 Ubuntu 系统中,每次打开 bash, 就会被执行,进行如下设置。

  1. 非交互模式则不进行下面的操作
  2. 窗口可调整
  3. 增强$PS1
  4. 设置 xterm (注释掉了)
  5. 交互模式中开启命令补全(注释掉了)
  6. 在 bash 中使用 sudo
  7. 安装 command-not-found 包后 bash 的变化

而 中设置的就比较多了,具体可以看文档注释。

四种不同的shell模式

登录模式

进入登录模式的 Shell 需要一个特定的用户名和密码,就像我们按 Ctrl + Alt + F1 进入 tty1 后输入用户名和密码后成功登录系统的情况。

非登录模式

非登录模式是指不用登录直接进入 Shell,它需要在特定用户登录状态下才能进入。就像在终端下直接输入 bashbash -c 'CMD'

交互模式

在交互模式的 Shell 中,标准输入,输出和错误都显示在终端上,此时变量 $PS1 一定会被设置。像以 bashbash -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'

试验步骤

  1. 登录模式
    在终端中设置完上面的变量之后,以 bash -l 进入另一个 bash,并显示上面的变量值
  2. 交互模式
    在终端中设置完上面的变量之后,以 bash -i 进入另一个 bash,并显示上面的变量
  3. 打开终端时,进入的模式
    在一个终端中设置完上面的变量后,打开另一个终端,显示上面的变量值

结论

  1. 登录模式中,四个文件都被执行了,执行的顺序是 /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
  2. 交互模式中,两个 profile 文件没有被执行,两个 bash 文件都被执行了,并且 /etc/bash.bashrc 比 ~/.bashrc 先执行
    ebash, bash 都有值,说明 bash 两个文件都被执行了。ebash_bash说明 ~/.profile 先于 ~/.bashrc
  3. 打开终端时,进入交互模式
    两个 profile 文件没有被执行,两个 bash 文件都被执行了,并且 /etc/bash.bashrc 比 ~/.bashrc 先执行。此状态和交互模式的状态一致。

待解决的问题

  1. 非登录模式如何确定?
  2. 之前的所有试验其实都包含了交互模式。非交互模式又如何确定?

参考文献

  1. shell的四种模式
  2. 理解 bashrc 和 profile
  3. Choosing between .bashrc, .profile, .bash_profile, etc

如果该文章对您产生了帮助,或者您对技术文章感兴趣,可以关注微信公众号: 技术茶话会, 能够第一时间收到相关的技术文章,谢谢!

shell运行环境之环境配置文件-LMLPHP


本篇文章由一文多发平台ArtiPub自动发布
03-09 20:45