# 序言

我想告诉你一个故事。

不，并不是关于 1991 年 Linus Torvalds 是如何写出第一版的 Linux 核心的。你可以在许多 Linux 书中读到那个故事。我也不打算告诉你，在比那更早的几年前，Richard Stallman 开启了 GNU 项目以创建一个自由的类 Unix 系统。那也是一个重要的故事，但是多数其它的 Linux 书籍中也会有那个故事。

不，我想告诉你的是，你如何取回对计算机的控制。

当我在 1970 年代末作为一个大学生开始用计算机工作的时候，有一场革命正在进行。微处理器的发明使得如你我这样的普通人能拥有一台计算机。今天的许多人很难想象仅有大企业和大政府才能使用计算机的世界是什么样的。只能说，你不能完成很多工作。

今天的世界已经非常不同。小到腕表、大到巨型数据中心，任何事物，到处都是计算机。除了无处不在的计算机，我们还有一个无处不在的网络把它们连接在一起。这创造了一个奇妙的个人赋权和创造自由的新时代，但是在过去的几十年中，还发生了一些其它事情。少数巨型公司已经强行控制了这个世界上的大多数计算机，并决定了你用计算机能做什么不能做什么。幸运的是，世界各地的人正在为此奋斗。他们通过写自己的软件来维持对他们的计算机的控制。他们在建设 Linux。

许多人谈及 Linux 的「自由」，但是我想大多数人不知道这个自由真正意味着什么。自由是一种能力，它决定你的计算机做什么，拥有这种自由的唯一途径是，了知你的计算机正在做什么。自由是一台计算机不存在秘密，只要你足够在意，可以了解到任何事物。

## 为何使用命令行？ <a href="#why-use-the-command-line" id="why-use-the-command-line"></a>

你有没有注意到电影里那些「超级黑客」——你知道的，那家伙可以在 30 秒内闯入超级机密的军用计算机——坐在计算机边上，从来没碰过鼠标？那是因为电影人知道我们，作为人类，本能地知道只有一个途径能真正知道计算机做了什么，那就是在键盘上输入！

今天，大多数计算机用户仅熟悉图形用户界面（GUI *graphical user interface*），被供应商和专家们教导着命令行界面（CLI *command line interface*）是过去时代的可怕事物。这很不幸，因为一个良好的命令行用户界面是绝妙的与计算机交流的表达途径，与人类书写文字的方式相差无多。有人说「图形用户界面使容易的任务容易，而命令行界面使得困难的任务成为可能」，这句话在今天看来也非常正确。

因为 Linux 仿照 Unix 操作系统家族，它与 Unix 共享了同样丰富的命令行工具传统。Unix 在 1980 年代早期引人注目（尽管其初代在十年前就被开发出来了），在图形用户界面被广泛采用之前，作为一个结果，开发了一款扩展的命令行界面。实际上，Linux 早期采用者选择它而非 Windows NT 的最重要原因之一，就是是强大的命令行界面，它使「困难的任务成为可能」。

## 本书内容是什么 <a href="#what-this-book-is-about" id="what-this-book-is-about"></a>

本书是一个「生活」在 Linux 命令行上的概览。不同于某些仅专注于某个诸如 shell 程序，`bash` 等单一问题的书籍，本书将尝试转换到在更大意义上如何与命令行界面相处。它是怎么完成这些工作的？它可以做什么？使用它的最佳方法是什么？

**这不是一本关于 Linux 系统管理的书。**&#x5C3D;管任何严肃的关于命令行的讨论都必然引向系统管理话题，本书则仅仅接触一点点管理事务。但是，它将为使用命令行提供坚实的基础，这将使读者为进一步的学习做好准备，而命令行是完成任何重要的系统管理任务所必需的工具。

**本书非常的 Linux 中心化。**&#x8BB8;多书籍会尝试扩大它们的兴趣，包含了其它平台，如普通 Unix 和 macOS。这样，它们「淡化」了内容，仅关注了一般性的话题。这本书则仅覆盖当代 Linux 发行版。百分之九十五的内容对其它类 Unix 系统用户有用，本书高度瞄准现代 Linux 命令行用户。

## 谁应该阅读本书 <a href="#who-should-read-this-book" id="who-should-read-this-book"></a>

本书为那些从其它平台迁移到 Linux 的新用户而作。如果是 Microsoft Windows 某个版本的「超级用户」，就最合适。或许你的老板已经让你去管理一台 Linux 服务器，或者你正在进入一个令人激动的单板计算机（SBC）新世界，如树莓派（Raspberry Pi）。也可能你只是一个厌倦了安全问题而想要尝试一下 Linux 的桌面用户。好的。这里都欢迎。

有人说，Linux 启蒙没有捷径。学习命令行非常有挑战性，并需要付出真正的努力。并没有这么难，不过相当的**广泛**。Linux 系统中可以用在命令行上的程序，平均有数千个之多。警告一下自己；学习命令行不能靠偶然的努力。

另一方面，学习 Linux 命令行非常有意义。如果你认为现在的你是「超级用户」，等着吧。你还不知道什么是真正的超级。并且，不同于其它计算机技巧，命令行的知识是长久持续的。今天所学的技巧，在十年后仍然有用。命令行经受住了时间的考验。

这里还假设你没有编程经验，不过不用担心，我们会让你开始朝这条路前进的。

## 这本书里有什么 <a href="#what-is-in-this-book" id="what-is-in-this-book"></a>

本书的材料通过一系列精心选择的序列来呈现，就像一个导师坐在你旁边指导你一样。许多作者以「系统的」方式处理该材料，并按顺序详尽地涵盖了每个主题。这从作者的视角来说是有意义的，但是可能会令新用户非常困惑。

另一个目标是使你熟悉使用 Unix 的方式去思考，这是不同于 Windows 的思考方式。在此过程中，我们会进行一些背景知识的讲解，以帮助您了解某些事物为何以这种方式工作、以及如何以这种方式工作。Linux 不仅仅是一个软件；它还是更大背景下 Unix 文化中的一小部分，有其自身的语言和历史。可能我还会说几句胡话。

本书分为四个部分，每部分覆盖一方面的命令行经验：

* **第一部分——学习 Shell** 开启了命令行基本语言的探索，包括命令的结构、文件系统导航、编辑命令行和查找命令的帮助文件和文档等。
* **第二部分——配置和环境**覆盖了从命令行控制计算机操作的配置文件的编辑。
* **第三部分——常见任务和基本工具**探索了许多经常用命令行执行的普通任务。类 Unix 操作系统，如 Linux，包含了许多「经典」的命令行程序，可以用来执行强大的数据操作。
* **第四部分——编写 Shell 脚本**介绍了 shell 编程，一种可以自动完成许多常见计算任务的基本而又简单易学的技术。通过学习 shell 编程，你会熟识许多用在其它编程语言中的概念。

## 如何阅读这本书 <a href="#how-to-read-this-book" id="how-to-read-this-book"></a>

从本书的开端起始，一步步直到最后。本书不是作为一本参考书，它真的更像一本有开始、有过程、有结束的故事书。

### 先决条件 <a href="#prerequisites" id="prerequisites"></a>

要使用本书，你所需要的是一台 Linux 工作装置。你可以用下列两种方式中的一种来完成：

1. **在一台（不是很新的）计算机上安装 Linux。**&#x9009;择何种发行版并不重要，尽管大多数用户会选择 Ubuntu、Fedora 或 OpenSUSE。如果有疑问，请先尝试 Ubuntu。安装现代 Linux 发行版可以是极其便捷，也可以是极其困难，这取决于你的硬件。我会建议一台有几年历史的桌面计算机，有至少 2GB 内存和 6GB 硬盘空间。可能的话，避免使用笔记本电脑和无线网络，因为那会使工作更困难。
2. **使用 "Live CD" 或者 USB 闪存盘。**&#x4F60;可以直接从 CDROM 或 USB 闪存盘上运行许多 Linux 发行版，而不必安装，这很时尚。进入 BIOS 程序，设置计算机从 CDROM 或 USB 设备启动，并重启。使用这种方式是一种在安装前检测计算机的 Linux 兼容性的好办法。缺点是对比安装在硬盘上的 Linux，运行速度可能会非常慢。Ubuntu 和 Fedora（还有其它发行版）都有 Live 版本。

无论是怎么安装的 Linux，你将会偶尔需要超级用户（即管理员）权限以执行本书中的课程。

在拥有一台工作装置之后，开始阅读，并使用你自己的计算机。本书大多数材料都是需要「动手」的，所以，坐下来，敲键盘吧！

> **为何我不将其称为 GNU/Linux？**
>
> 在某些地方，会政治正确地称呼 Linux 操作系统为「GNU/Linux 操作系统」。"Linux" 的问题在于，没有完全正确的命名方式，因为它是由许多不同的人在大量的分布式开发工作中编写的。 从技术上讲，Linux 是这个操作系统的核心，仅仅如此。核心当然极其重要，因为它使得操作系统运转，但是它不足以构成一个完整的操作系统。
>
> 进入 Richard Stallman，这个天才哲学家，他发起了自由软件运动，建立了自由软件基金会（Free Software Foundation），成立了 GNU 项目，写出了第一个版本的 GNU C 编译器（gcc），创造了 GNU 通用出版许可（GPL General Public License），等等等等。他**坚持**认为你应该称呼它为 "GNU/Linux" 以正确地反映 GNU 项目的贡献。尽管 GNU 项目早于 Linux 核心，且该项目的贡献极其值得认可，但是将其置于该名称中对于其他作出重大贡献的人来说是不公平的。另外，我认为，"Linux/GNU" 这个名称，在技术上讲会更精确，因为首先是内核启动，而后才是其它程序运行于其上。
>
> 在通常的用法中，"Linux" 指的是其内核及所有在典型的 Linux 发行版中的其它自由开源的软件，换言之，是整个 Linux 生态系统，而非仅仅是 GNU 组件。操作系统市场看起来更偏爱单名，如 DOS、Windows、macOS、Solaris、Irix 和 AIX。我选用了通常的格式。然而，如果你更喜欢使用 "GNU/Linux"，请在阅读本书的过程中，精神上执行个检索替换。我不会介意的。

## 当前版本有何增删 <a href="#what-is-in-the-fifth-internet-edition" id="what-is-in-the-fifth-internet-edition"></a>

略

## 致谢 <a href="#acknowledgments" id="acknowledgments"></a>

略

## 需要你的反馈 <a href="#your-feedback-is-needed" id="your-feedback-is-needed"></a>

略

## 扩展阅读 <a href="#further-reading" id="further-reading"></a>

* 关于上面提及的几个著名人物，有几篇维基百科的文章：
  * <http://en.wikipedia.org/wiki/Linux_Torvalds>
  * <http://en.wikipedia.org/wiki/Richard_Stallman>
* 关于自由软件基金会和 GNU 项目：
  * <http://en.wikipedia.org/wiki/Free_Software_Foundation>
  * <http://www.fsf.org/>
  * <http://www.gnu.org/>
* Richard Stallman 撰写了大量有关 "GNU/Linux" 命名问题的文章：&#x20;
  * <http://www.gnu.org/gnu/why-gnu-linux.html>
  * <http://www.gnu.org/gnu/gnu-linux-faq.html#tools>

## 出版附记 <a href="#colophon" id="colophon"></a>

略

## 译者言 <a href="#the-words-of-translator" id="the-words-of-translator"></a>

本书译自 William Shotts 的 The Linux Command Line (Fifth Internet Version)。限于水平，必是讹误不少。读者识之。

英文版下载地址：<http://linuxcommand.org/tlcl.php>

2019 年 11 月 22 日初稿

![知识共享署名-非商业性使用 4.0 国际许可协议](https://3282890576-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LlASrS7HdAw9kfiSbKo%2F-LuC5ZNaHIWJ9yvisAlx%2F-LuC5a5Lqbe7D0X0qJve%2Fby_nc_4.png?generation=1574325347815497\&alt=media) 本作品采用[知识共享署名-非商业性使用 4.0 国际许可协议](http://creativecommons.org/licenses/by-nc/4.0/)。
