PATH 是 Linux 和其他类 Unix 作系统中的一个环境变量,它告诉 shell 搜索哪些目录以响应用户发出的命令来搜索可执行文件(即准备运行的程序)。它提高了此类作系统的便利性和安全性,并被广泛认为是最重要的环境变量。
环境变量是一类变量(即其值可以更改的项),它们告诉 shell 在用户在命令行(即在纯文本模式下)或使用 shell 脚本(即用 shell 编程语言编写的短程序)时如何表现。shell 是一种为类 Unix作系统提供传统的纯文本用户界面的程序;它的主要功能是读取在命令行中键入的命令,然后执行(即运行)它们。
PATH(用所有大写字母书写)不应与术语 PATH(小写字母)混淆。后者是文件系统上文件或目录的地址(即,用于组织存储在计算机上的信息的目录和文件的层次结构)。相对路径是相对于当前目录(即用户当前工作的目录)的地址。绝对路径(也称为完整路径)是相对于根目录(即文件系统最顶部的目录,包含所有其他目录和文件)的地址。
用户的 PATH 由一系列以冒号分隔的绝对路径组成,这些路径存储在纯文本文件中。每当用户在命令行中键入未内置于 shell 或不包含其绝对路径的命令,然后按 Enter 键时,shell 就会搜索构成用户搜索路径的这些目录,直到找到具有该名称的可执行文件。
默认情况下,大多数可执行文件集中在几个目录中,而不是分布在整个文件系统中,并且使用 PATH 变量来查找它们,使用户无需记住它们位于哪些目录中并键入其绝对路径名。也就是说,任何此类程序都可以通过简单地键入其名称来运行,例如 ls 而不是 /bin/ls 和 head 而不是 /usr/bin/head,无论用户当前在文件系统上工作的哪个位置。这也大大降低了因意外运行与标准命令同名的脚本而损坏数据甚至整个系统的可能性。1
通过运行 env 命令,可以在没有任何选项或参数(即输入数据)的情况下查看当前用户的所有当前环境变量及其值的列表,包括 PATH 变量中的所有目录,即
env
由于可以有相当大的输出,因此修改此命令以使其仅显示 PATH 环境变量及其值会很方便。这可以通过使用管道(由垂直条字符表示)将 env 的输出传输到 grep 过滤器并使用 PATH 作为 grep 的参数来实现,即
env | grep PATH
单独查看 PATH 内容的另一种方法是使用 echo 命令和 $PATH 作为参数:
echo $PATH
echo 在显示屏上重复命令行上后面的任何内容。紧接在 PATH 前面的美元符号告诉 echo 重复变量 PATH 的值而不是其名称。
系统上的每个用户都可以有不同的 PATH 变量。安装作系统时,将为根(即管理)帐户创建一个默认 PATH 变量,并创建另一个默认变量,该变量将在添加到系统中的所有普通用户帐户时应用于这些帐户。root 用户的 PATH 变量包含的目录比普通用户多,因为它包含目录,例如 /sbin 和 /usr/sbin,这些目录包含通常仅由该用户使用的程序。
PATH 变量可以相对容易地更改。它们可以仅针对当前登录会话进行更改,也可以永久更改(即,以便更改将在将来的会话中持续存在)。
将目录添加到用户的 PATH 变量(从而将其添加到用户的默认搜索路径)是一件简单的事情。可以使用以下命令为当前会话完成此作,其中 directory 是要输入的目录的完整路径:
PATH="directory:$PATH"
例如,要添加目录 /usr/sbin,将使用以下内容:
PATH="/usr/sbin:$PATH"
另一种方法是使用导出命令,该命令用于更改环境的各个方面。因此,上述绝对路径可以依次添加以下两个命令
PATH=$PATH:/usr/sbin
export PATH
或其单行等效项
export PATH=$PATH:/usr/sbin
通过再次使用 echo 命令以 $PATH 作为其参数可以轻松确认目录已添加。
通过将用户的 PATH 变量添加到该用户的 .bash_profile 文件中,可以将其永久添加。.bash_profile 是每个用户主目录中的一个隐藏文件,用于定义该用户的任何特定环境变量和启动程序。隐藏文件是名称以点(即句点)开头且通常不可见的文件;但是,可以通过使用 ls(即列表)命令及其 -a(即全部)选项来看到它。
因此,例如,要将名为 /usr/test 的目录添加到用户的 PATH 变量中,应在以 PATH 开头的行中附加文本编辑器,以便该行读作 PATH=$PATH:$HOME/bin:/usr/test 之类的内容。重要的是,每个绝对路径前面必须直接(即没有中间空格)前面有一个冒号。
有时需要运行已安装在用户主目录或不在用户默认搜索路径中的其他位置的脚本或程序。当然,此类脚本或程序可以通过键入其绝对路径来运行。但是,当脚本或程序位于当前目录中时,通常更方便的替代方法是仅在命令名称前面加上点斜杠(即,点后跟正斜杠,中间没有空格)。点在路径中用于表示当前目录,斜杠用作目录分隔符,并将目录名与文件名分隔开来。
MS-DOS 还使用 PATH 变量。但是,它与类 Unix作系统的不同之处在于,它会在搜索该变量中的任何目录之前搜索用户的当前目录。
________
1一个极端的例子是,普通用户创建了一个 shell 脚本,例如 rm -r /,它将删除系统中用户具有写入权限的所有文件和目录,并将此脚本命名为 ls。如果系统管理员导航到此脚本所在的目录并尝试运行标准 ls 命令以查看该目录的内容,则 shell 将运行具有相同名称的脚本,从而删除计算机上所有当前装载分区的内容!

