路径

作者:Lynda Williams
从家目录开始

登录后,在 Linux 提示符下输入 pwd,您将看到如下内容

/home/williams

这是一个路径;在本例中,是我的家目录的路径。目录是文件的存放位置。它们也可以包含其他目录。路径 /home/williams 是 “目录 home 中的目录 williams,而 home 目录又在文件系统的根目录中” 的简写。“/” 字符之间的每个单词都是一个名称;它所命名的就是一个目录。pwd 命令向我报告 /home/williams,因为它是我 “当前工作目录”,更常被称为当前或默认目录。

当前目录是一个简单的概念,但有很多方面。登录后立即,它是您的家目录。之后,它可以是文件系统上的任何目录。您的当前目录实际上是您的 shell 的当前目录。其他进程有它们自己的当前目录,并且可以独立更改。即使是具有多个子窗口的单个进程,也可能为每个窗口维护一个当前目录。

意识到命令行用户会说 “我在 /etc/skel 中”,而同一系统的图形界面用户会报告 /etc/skel 是 “打开的”,这很有用。两者意思相同。当前目录是您的命令和任何请求文件的假定目标。路径允许您引用其他目录。不幸的是,由于历史性的命名选择,学习使用路径可能会不必要地痛苦。

令人困惑的命名法

命名法描述了事物是如何命名的。路径名中的 / 符号,存在一个称为重载的命名法怪癖,这意味着它可以被正确地解释为多种含义。

如果路径以 / 开头,则含义是 “根”。根本身就是一个目录。[请注意,/,表示文件系统的根目录,不应与 /root 混淆,/root 是 / 目录中的一个目录——编者注] 将其视为不包含在任何其他目录中的 “老大” 目录。初学者经常完全 “看不到” 根目录,因为前导 / 的视觉冲击很小。这是一个严重的错误。在根目录之后,两个目录名称之间的 / 仅仅是分隔它们。/ 不是一个目录——它只是一个分隔符。尝试这个简单的测试,看看您是否理解了。在 /home/williams 中有多少个目录?

答案是三个,而不是两个。我的课程中最常见的第一年学生会数出 /home 和 /home/williams 两个目录。大约四分之一的学生每个学期都漏数了根目录本身。如果我们从路径扩展到文件,命名法就会变得模棱两可。无论我们多么仔细地检查 /home/williams/foo,我们都无法推断出 foo 是文件还是目录。如果名称是 /home/williams/foo.txt,我们可能会认为 foo.txt 是一个文件,但目录有可能带有扩展名,而文件通常会省略扩展名。

以下两个示例告诉您关于名称 listsweba 的什么信息?(cd [更改目录] 命令会重置您的当前目录。)

Example 1
$ cd /home/lynda/lists
$ pwd
/home/lynda/lists
Example 2
$ cd /home/lynda/weba
bash: /home/lynda/weba: Not a directory
$ pwd
/home/ftp/pub/weba

您应该能够推断出 lists 是一个目录,但 weba 不是。当然,有很多方法可以解决歧义,从过去的经验开始,到 file 命令,以及 ls 命令的 -F-l 选项。

相对路径

到目前为止,我的所有路径都以根目录开头。以这种方式开头的路径名,无论当前目录是什么,都具有相同的含义。它们被称为 绝对 路径。例如,命令

$ cd /home/ftp/pub/weba

```bash

$ cd weba
将使 /home/ftp/pub/weba 成为我的新当前目录,而不管现有的目录是什么。以下命令会实现什么?
Example 1 (success)
/home $ cd ftp/pub
/home/ftp/pub $
Example 2 (failure)
/home $ cd pub
bash: pub: No such file or directory
/home $
example 3 (failure)
/home $ cd /ftp/pub
bash: /ftp/pub: No such file or directory
/home $
example 4 (success)
/home $ cd ..
/ $
任何不以斜杠 (/) 开头的文件或目录引用都是相对的。这就引出了一个问题 “相对于什么?” 相对于当前目录。因此,只有当我的当前目录已经是 /home/ftp/pub 时,上面的命令才会按预期工作。考虑以下尝试使用相对路径更改目录的情况。提示符已更改以在 $ 符号之前显示当前目录,并且我为了增强可读性而自由地使用了空格。

相对路径只是以当前目录作为前缀的绝对路径。它们比绝对路径更常见,因为我们倾向于在我们当下最感兴趣的目录中工作。但是请注意,以 / 开头来启动相对路径是错误的,如示例 3 中所示,因为这样做会使路径变为绝对路径。注重语法的人会注意到,我们因此丢失了一个分隔符 /。

/home/ftp $     cd ../williams
/home/williams $
在构建相对路径时,有两个特殊组件,分别是 . 和 ..,它们分别代表 “当前目录” 和 “包含当前目录的目录”。您可以单独使用它们,如示例 4 中所示,也可以与其他组件一起使用,如下面这个相当典型的示例,即备份并前进到不同的目录

使用路径构建

对路径使用的信心有助于处理各种更复杂的主题。环境变量 $PATH 是一个由冒号分隔的普通路径列表。shell 使用它来搜索要执行的程序文件。许多程序使用特殊变量来建立其操作的基本路径;当需要路径作为命令参数时,了解如何构造路径非常有用。

Paths
我们看到了路径如何在文件的绝对名称中发挥作用。它们也出现在 URL(统一资源定位符,通常与万维网相关联)中。路径可能是您最先学习的东西之一,但它们的应用是无穷无尽的。
Lynda Williams (http://quarles.unbc.edu/ljw.html) 在北不列颠哥伦比亚大学指导教员开发网站,由她的 Linux 服务器 (http://vaughan.fac.unbc.edu/ctl) 支持,并在她的计算机应用课程 (http://quarles.unbc.edu/cpsc150) 中教授一年级学生的计算生存策略。她在社区网络运动中的开创性工作 (telnet freenet.unbc.edu) 是她对普及计算技术兴趣的另一种表达。可以通过电子邮件 williaml@unbc.edu 与她联系。