(014) Linux之环境
十年运维系列之基础篇 - Linux
作者:曾林
联系:1494445739@qq.com
版权:文章未经同意请勿转载
一、引言
在shell会话调用环境期间,shell会存储大量的信息。有一些程序会查找环境中存储的变量来调整自己的行为。知道了这一点之后,用户就可以使用环境来自定义shell。
二、环境中存储的是什么
尽管shell在环境中存储了两种基本类型的数据,但是在bash中,这两种类型基本上没有区别。这两种数据类型分别是环境变量和shell变量。shell变量是由bash存放的少量数据,环境变量就是除此之外的所有其他变量。除变量之外,shell还存储了一些编程数据,也就是别名和shell函数。
要了解环境中存储的内容,需要用到集成在bash中的set命令或者printenv程序。不同的是,set命令会同时显示shell变量和环境变量,而printenv只会显示环境变量。
set命令截图如下(其中包括环境变量和shell变量):
printenv命令截图(只包括环境变量):
环境变量中包含了相当多的变量,下表展示了一些常用的有趣的环境变量。
变量 | 说明 |
SHELL | 本机shell名称 |
HOME | 本机主目录的路径名 |
LANG | 定义了本机语言的字符集和排序规则 |
OLD_PWD/PWD | 先前的工作目录/当前的工作目录 |
PATH | 以冒号分隔的一个目录列表,当用户输入一个可执行程序的名称时,会查找该目录列表 |
PS1 | 提示符字符串1.定义了本机shell系统提示符的内容。 |
TERM | 终端类型的名称。类UNIX系统支持很多种终端协议;此变量定义了本机终端模拟器使用的协议 |
USER | 用户名 |
三、环境是如何建立的
用户登录系统之后,bash程序就会启动并读取一系列称为启动文件的配置脚本,这些脚本定义了所有用户共享的默认环境。接下来,bash会读取更多存储在主目录下用于定义个人环境的启动文件。这些步骤执行的确切顺序是由启动的shell会话类型决定的。
shell会话存在两种类型,分别为login shell和non-login shell会话。
login shell会话会提示用户输入用户名和密码,如虚拟控制台会话。而我们在GUI中启动的终端会话就是一个典型的non-login shell会话。
login shell会读取一个或多个启动文件,如下表显示:
文件 | 说明 |
/etc/profile | 适用于所有用户的全局配置脚本 |
~/.bash_profile | 用户的个人启动文件。可扩展或重写全局配置脚本中的设置 |
~/.bash_login | 若~/.bash_profile缺失,则bash尝试读取此脚本 |
~/.profile | 若~/.bash_profile和~/.bash_login均缺失,则bash尝试读取此文件。在基于Debian的Linux版本中(比如Ubuntu),这是默认值 |
下表是non-login shell读取的启动文件:
文件 | 内容 |
/etc/bashrc | 适用于所有用户的全局配置脚本 |
~/.bashrc | 用户的个人启动文件。可扩展或重写全局配置脚本中的设置 |
在读取以上启动文件之外,non-login shell还会继承父类进程的环境,父类进程经常就是一个login shell。
在普通用户看来,~/.bashrc可能是最重要的启动文件,因为系统几乎总是要读取它。non-login shell会默认读取~/.bashrc,而大多数login shell的启动文件也能以读取~/.bashrc文件的方式来编写。