文章目录


在shell会话调用环境(environment)期间,shell会存储大量的信息。程序使用存储在环境中的数据来确定我们的配置。尽管大多数系统程序使用配置文件(configuration file)来存储程序设置,但是也有一些程序会查找环境中存储的变量来调整自己的行为。

1、环境中存储的是什么

尽管shell在环境中存储了两种基本类型的数据,但是在bash中,这两种类型基本没有区别。这两种数据类型分别是环境变量(environment variable)和shell变量(shell variable)。shell变量是由bash存放的少量数据,环境变量就是除此之外的所有其他变量。除变量之外,shell还存储了一些编程数据(proframmatic data),也就是别名和shell函数。

1.1、检查环境

要了解环境中存储的内容,需要用到集成在bash中的​​set​​​命名或​​printenv​​​程序。不同的是,​​set​​​命令会同时显示shell变量和环境变量,而​​printenv​​​程序只会显示环境变量。由于环境的内容可能会比较冗长,所以最好将这两个命令的输出以管道形式重定向到​​less​​命令中。

printenv | less

Linux--环境_bash


可以看到,输出结果是一系列的环境变量及其变量值。例如,名为USER的变量,其值为pi。命令​​printenv​​也能够列出特定变量的值。

Linux--环境_bash_02


在使用​​set​​命令时,如果不带选项或参数,那么只会显示shell变量、环境变量以及任何已定义的shell函数。

set | less

Linux--环境_文本编辑器_03


与​​printenv​​​命令不同的是,​​set​​​命令的输出结果是按照字母顺序排列的。如需查看单个变量的值,也可以使用​​echo​​命令,如下所示:

Linux--环境_文本编辑器_04


​set​​​命令和​​printenv​​​命令都不能显示的一个环境元素是别名。要查看别名,需使用不带任何参数的​​alias​​命令。

Linux--环境_文本编辑器_05

1.2、一些有趣的变量

环境中包含了相当多的变量,尽管你所使用的环境与这里的不相同,也会在你的环境中看到下表中所示的变量。

变量

说明

DISPLAY

运行图形界面环境时界面的名称。通常为:O,表示X服务器生成的第一个界面

EDITOR

用于文本编辑的程序名称

SHELL

本机shell名称

HOME

本机主目录的路径名

LANG

定义了本机语言的字符集合排序规则

OLD_PWD

先前的工作目录

PAGER

用于分页输出的程序名称。通常设置为/usr/bin/less

PATH

以冒号分割的一个目录列表,当用户输入一个可执行程序的名称时,会查找该目录列表

PS1

提示字符串1。定义了本机shell系统提示符的内容

PWD

当前工作目录

TERM

终端类型的名称。类UNIX系统支持很多种终端协议:此变量设定了本机终端模拟器使用的协议

TZ

用于指定本机所处的时区。大多数类UNIX系统已协调世界是(UTC)来维护计算机的内部时钟,而显示的本地时间是根据本变量确定的时差 计算出来的

USER

用户名

如果某些变量无法在该表中找到也不要紧,因为这些变量会因发行版本的不同而有差异。

2、环境是如何建立的

用户登录系统后,bash程序就会启动并读取一系列称为启动文件的配置脚本,这些脚本定义了所有用户共享的默认环境。接下来,bash会读取更多存储在本目录下的用于定义个人环境的启动文件。这些步骤执行的确切顺序是由启动的shell会话类型决定的。

2.1、login和non-login 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/bash.bashrc

适用于所有用户的全局配置脚本

~/.bashrc

用户的个人启动文件。可扩展或重写全局配置脚本中的设置

在读取以上启动文件之外,non-login shell还会继承父类进程的环境,父类进程通常是一个login shell。
用户可以查看本机系统由哪些启动文件,需要注意的是这些文件大多数以“.”开头(意味着这些文件是被隐藏的)。所以用户在使用​​​ls​​​命令时,需要伴随使用​​-a​​​选项。
在普通用户看了,~/.bashrc可能是最重要的启动文件,因为系统几乎总是要读取它。non-login shell会默认读取~/.bashrc。而大多数login shell的启动文件也能以读取~/.bashrc文件的方式来编写。

2.2、启动文件中有什么

一个典型的.bash_profile(来自CentOS-4系统)内容如下所示:

# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc]; then
. ~/.bashrc
fi
# User specific environment and startup programs

PATH=$PATH:$HOME/bin
export

文件中以“#”开始的行是注释行,而shell是不会读取注释行的,注释是为提高用户可读性而存在的。一件有趣的事发生在第4行,如下所示:

if [ -f ~/.bashrc]; then
.

这段到吗被称作​​if​​复合命令,可以将这段到吗理解为如下所示的内容:

If the file "~/.bashrc" exist, then
read the "~/.bashrc"

可以看到这一段到吗阐述了login shell读取.bashrc文件的机制。以上启动文件中另一个很重要的元素是PATH变量。
在命令行输入一条命令后,你曾经疑惑过shell是怎样找到这些命令的吗?当用户输入命令​​​ls​​​,shell不会搜索整个系统来寻找/bin/ls(​​ls​​​命令的完整路径名),而是会搜索PATH变量中存储的目录列表。
PATH变量通常是由启动文件/etc/profile中的一段代码设置(并不总是如此,这取决于系统的发行版本)。

PATH=$PATH:$HOME/bin

这段代码将Linux--环境_bash_06HOME/bin​​​添加到PATH值的尾部之后,当系统需要检索用户输入的命令时,​​​$HOME/bin`这个路径就会处于贝索斯的路径列表中。这就意味着当我们想在主目录下创建名为bin的目录,并在此目录中存放自己私有程序时,shell已经为我们准备好了,我们要做的就是将创建的目录称之为bin。
注意:很多Linux发行版本在默认情况下提供了该PATH设置。一些基于Debian的发行版本,如Ubuntu,会在登录时检查~/bin目录是否存在,若存在,就会自动将其添加到PATH变量中。

export

该export命令告诉shell,将shell的子进程使用PATH变量的内容。

3、修改环境

现在用户已经知道了系统启动文件的位置和内容,就可以修改启动文件,来实现自定义我们的环境。

3.1、用户应当修改哪些文件

一般来说,在PATH中添加目录,或者定义额外的环境变量,需要将这些更改放入.bash_profile文件中(或者是其他的等效文件,这取决于系统的发行版本,比如Ubuntu系统使用的是.profile文件),其他的改变则应录入.bashrc文件中。除非是系统管理员需要修改用户共用的默认设置,普通用户只需对主目录下的文件作出修改即可。当然用户也可以修改其他目录下的文件,比如/etc下的profile文件,而且很多情况下会需要用户这样做。

3.2、文本编辑器

为了编辑(比如修改)shell的启动文件,以及系统中的其它大多数配置文件,我们会用到一个称为文本编辑器的程序。文本编辑器类似于字处理器,它允许用户通过移动光标的方式来编辑屏幕中的文字。与字处理器不同的是,文本编辑器只支持纯文本,而且通常包含为编写程序而设计的特性。文本编辑器是软件开发人员编写代码的主要工具,系统管理员也可以使用文本编辑器来管理系统的配置文件。
Linux系统可使用的文本编辑器有很多种,文本编辑器可大概分为两类:图形界面的和基于文本的。GNOME(GNU网络对象模型环境)和KDE(K桌面环境)都配备有一些留下的图形界面编辑器。GNOME配备的编辑器叫做gedit,在GNOME菜单中gedit通常被称为Text Editor。KDE则配备了三种编辑器,分别是kedit、kwirte和kate(复制程序递增)。
有很多基于文本的编辑器,常见编辑器中比较受用户环境的是nano、vi和emacs。nano是一种简单易用的编辑器,最初是为了替代pico(由PINE电子邮件套件提供)而出现的。vi是类UNIX系统的传统文本编辑器(在大多数Linux系统中已被vim–Vi Improved的缩写–所替代)。而emacs编辑器最初由Richard Stallman编写,这是一个庞大的、万能的、可做任何事情的编程环境。尽管emacs仍然可用,凡是大多数Linux系统很少默认安装emacs。

3.3、使用文本编辑器

所有的文本编辑器都可以通过在命令行输入编辑器名称和需编辑的文件名称的方式启动。如果输入的文件不存在,编辑器会认为用户想要创建一个新的文件。我们通过.bashrc文件的编辑过程来讲解nano,nano是一个基于文本的文本编辑器。但在此之前,需要先蔡旭一些安全措施。在修改一些重要的配置文件时,先对配置文件进行备份在进行编辑是一个很好的习惯。当用户把文件修改的一团糟的时候,备份就很有用处了。我们可以使用以下代码备份.bashrc:

Linux--环境_bash_07


为备份文件取什么名字并不重要,只要备份文件的名称易于理解即可。扩展名.bak、.sav、.old和.orig是常用的标示备份文件的方法。需要说明的是,cp命令会默默地覆盖现有的文件。

备份文件完成之后,就可以启动文件编辑器了。

Linux--环境_文本编辑器_08


屏幕显示内容分为三部分:顶端的 标题(header)、中间的可编辑文本和底部的命令菜单。由于nano是替代电子邮件文本编辑器出现的,所以其编辑功能非常有限。

对于每一种文本编辑器,你都应该先学习它的退出命令。就nano而言,可按Ctrl-X退出程序,在页面底部的命令菜单中有相关的介绍。“^X”代表了Ctrl-X,这是控制字符的常见表示法,很多程序中都使用它。

我们需要了解的第二个命令就是如何保存我们的工作。就nano而言,按Ctrl-O完成保存。掌握这些知识之后,我们就可以进行文本编辑操作了。在.bashrc文件的最后添加如下代码:

Linux--环境_bash_09

注意:用户系统的.bashrc文件可能已经写入了这些代码的一部分,但是不用担心,重复的代码不会造成什么危害。
以上代码的含义如下:

代码行

含义

umask 0002

设置umask值以解决共享目录的默认权限

export HISTCONTROL=ignoredups

使shell的历史记录功能忽略与上一条录入的命令重复的命令

export HISTSIZE=1000

使命令历史纪录规模从默认的500行增加到1000行

alias l.=‘ls -d .* --color=auto’

创建新的命令:​​l.​​​,功能是显示所有以​​.​​开头的目录条目

alias ll=‘ls -l --color=auto’

创建新的命令:​​ll​​,功能是以长格式来展示目录列表

可以看到,很多新增加的代码并不易于理解,所以就需要在添加玩代码的时候添加一些注释来帮助用户理解代码的含义。

3.4、激活我们的修改

因为只有启动shell会话时才会读取.bashrc,所以对.bashrc做出的修改只有在关闭shell终端会话并重启的时候才会生效。当然也可以使用以下命令强制命令bash重新读取.bashrc文件。

Linux--环境_bash_10


重新读取.bashrc之后,文件中做出的修改就会生效,例如使用新定义的别名:

Linux--环境_bash_11