二、环境是如何建立的
用户登录系统后,bash 程序就会启动并读取一系列称为启动文件的配置脚本,这些脚本定义了所有用户共享的默认环境。
接下来,bash 会读取更多存储在主目录下的用于定义个人环境的启动文件。
这些步骤执行的确切顺序是由启动的 shell 会话类型决定的。
(准)
1.shell 会话的 2 种类型
shell 会话存在两种类型,分别为 login shell 会话和 non-login shell 会话。
login shell 会话会提示用户输入用户名和密码,如虚拟控制台会话。
而我们在 GUI 中启动的终端会话就是一个典型的 non-login shell 会话。
(准)
(1)login shell会话
会提示用户输入用户名和密码。
login shell 会话会读取一个或多个启动文件。
① login shell 的启动文件
文件 | 说明 |
---|---|
/etc/profile | 适用于所有用户的全局配置脚本。 |
~/.bash_profile | 用户的个人启动文件。可 扩展 或 重写 全局配置脚本中的设置。 |
~/.bash_login | 若 ~/.bash_profile 缺失,则 bash 尝试读取此脚本。 |
~/.profile | 若 ~/.bash_profile 缺失 与 ~/.bash_login 均缺失,则bash 尝试读取此脚本。在基于 Debin 的Linux版本中(比如Ubuntu),这是默认值。 |
(准)
(2)non-login shell会话
在 GUI 中启动的终端会话。
① non-login shell 的启动文件
文件 | 说明 |
---|---|
/etc/bash.bashrc | 适用于所有用户的全局配置脚本。 |
~/.bashrc | 用户的个人启动文件。可 扩展 或 重写 全局配置脚本中的设置。 |
② non-login shell继承父类进程的环境
在读取以上启动文件之外,non-login shell还会继承父类进程的环境,父类进程通常是一个 login shell。
用户可查看本机系统有哪些启动文件,需要注意的是,这些文件大多数以“ . ”开头(这意味着这些文件是被隐藏的),所以用户在使用 ls 命令时需要伴随使用 -a 选项。
③ ~/.bashrc文件
在普通用户看来 ~/.bashrc 可能是最重要的启动文件,因为系统几乎总是要读取。non-login shell 会默认读取 ~/.bashrc ,而大多数login shell 的启动文件也能 以读取 ~/.bashrc 文件的方式来编写。
2.启动文件中有什么?
(1)PATH变量
① 是什么?
PATH变量通常是告诉系统,当要求系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前目录下面寻找此程序外,还应到哪些目录下去寻找。
PATH 变量是由启动文件 /etc/profile 中的一段代码设定(当然,这也并不总是如此,这取决于系统的发行版本)。
② 为什么?
指定命令搜索路径。
当在命令行输入一条命令后,shell 是如何找到这些命令的呢?
比如说,当我输入命令 ls ,shell 不会搜索整个系统文件来寻找 /bin/ls(这是 ls 命令的完整路径名),而是会搜索 PATH 变量中存储的目录列表。
③ 参数扩展的机理
在了解怎么做之前,先来看看参数扩展的机理,借助以下代码理解参数扩展(参数扩展在第7章讲过)的机理:
foo="This is some"
echo $foo
foo=$foo" text."
echo $foo
使用参数扩展,用户可将更多的内容添加到变量值的尾部。
④ 怎么做?
PATH=$PATH:$HOME/bin
上面这段代码,将 $HOME/bin 添加到了 PATH 值的尾部。这是一个参数扩展的实例。
在把字符串 HOME/bin这个路径就会处于被搜索的路径列表中。这就意味着,当我们想在主目录下创建名为 bin 的目录,并在此目录中存放自己的私有程序时,shell 已经为我们准备好了,我们只需将创建的目录称之为 bin 即可。
export PATH
最后一行是如上代码,该 export 命令告诉 shell ,使得 shell 的子进程使用PATH变量的内容。
⑤ 注意
很多 Linux 发行版本在默认情况下提供了该 PATH 设置。一些基于 Debian 的发行版本,如 Ubuntu ,会在登录时检查 ~/bin 目录是否存在,若存在,就会自动将其添加到PATH变量中。
网友评论