下一篇 上一篇 目录

3. 概述

所有 Unix 进程都包含一个“环境”。这是一个变量列表,其中包含名称和值,两者都是可以包含大多数字符的字符串。所有 Unix 进程都有一个父进程 - 即创建此进程作为子进程的进程。子进程从父进程继承环境。它们可以在将环境依次传递给其子进程之前,对环境进行一些修改。

一个重要的环境变量是 PATH,它是由冒号(':')分隔的目录列表。这些目录会被搜索以查找命令。如果您尝试调用命令 'foo',则会按照 PATH 中的顺序搜索所有目录,以查找可执行文件 'foo' (具有 x 位的文件)。如果找到文件,则执行它。

在本 HOWTO 中,我使用术语“命令”来指代旨在通过短名称调用的可执行程序,使用路径机制。

在 Linux 中,即使是用于启动进程的底层操作系统调用(exec 系列调用)也会在 PATH 变量中搜索目录:您可以在任何尝试执行命令的地方使用路径机制。如果 exec 操作系统调用获取的文件名不包含 '/',它会评估 PATH 环境变量。即使环境中没有 PATH 变量,至少也会搜索 /bin 和 /usr/bin 目录以查找合适的命令。

在 sh 中,您使用 export 命令设置环境,在 csh 中,您使用 setenv 命令。例如

sh

PATH=/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games:.
csh
setenv PATH /usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games:.

C 程序可以使用 setenv() 库调用来更改环境。Perl 在关联数组 %ENV 中具有环境,您可以将 PATH 设置为 $ENV{PATH}="/bin"。

env 命令是询问当前环境变量的基本方法。它也可以用于修改环境变量。

有关基本环境机制的更多信息,可以从手册页 'environ'、'execl'、'setenv'、info 文件 'env' 和 shell 的文档中找到。

当 Linux 启动时,第一个启动的正常进程是 init 进程。这是一个特殊的进程,因为它没有父进程。然而,它是所有其他进程的祖先。如果进程不显式地修改环境,则 Init 环境将保留为所有进程的环境。大多数进程都会修改环境。

Init 启动一组进程。文件 /etc/inittab 告诉系统启动哪些进程。这些进程在直接从 init 继承的环境中工作 - 通常它们是像 'getty' 这样的进程,这个程序在控制台上写入 'login:'。如果您在此处启动 PPP 连接,您必须记住您正在 init 环境中工作。系统初始化通常是一个在此处启动的脚本。在 Debian 1.3 中,初始化脚本是 /etc/init.d/rc,它依次调用其他初始化脚本。

系统包含许多正在运行的服务器(守护进程),它们可能使用也可能不使用默认环境。大多数服务器是从初始化脚本启动的,因此它们具有 init 环境。

当用户登录到系统时,环境会受到编译到程序中的设置、系统范围的初始化脚本和用户初始化脚本的影响。这非常复杂,并且当前情况并不完全令人满意。如果用户从文本控制台、XDM 或网络登录,情况则完全不同。


下一篇 上一篇 目录