前言

我想讲一个故事。这个故事不是林纳斯·本纳第克特·托瓦兹(Linus Benedict Torvalds)在1991年如何编写了Linux内核的第1版,你在很多Linux图书中都能找到相关内容。我也不打算向你讲述理查德·马修·斯托曼(Richard Matthew Stallman)在更早之前,如何为了创建一个自由的类UNIX系统而发起了GNU项目。这也是一件大事,不过大多数Linux图书中同样有所讲述。

我想告诉大家的是一个如何夺回计算机控制权的故事。

我开始和计算机打交道时,正值20世纪70年代,那时我还是一名大学生,一场“革命”同时正在进行。微处理器的发明使你我这样的普通人都有可能拥有一台自己的计算机。今天,很多人难以想象,只有大型公司和政府机构才能够使用计算机的世界是怎样的。只能说,你很难身临其境。

如今,世界已经截然不同。计算机遍布各个领域,从微型腕表到大型数据中心,以及介于二者之间的各种形式。除随处可见的计算机之外,我们还有一个无处不在的网络,它将所有计算机相互连接在一起。这造就了个人赋权和自由创作的奇妙纪元。但在过去的数十年间,还发生着另一些事情。少数大公司将控制权施加到计算机上,决定你对计算机能做什么、不能做什么。庆幸的是,世界各地的人们奋力抗争,通过自己编写软件来维护对自己计算机的控制权。他们创造了Linux。

在提及Linux的时候,很多人会说到“自由”,但是我觉得大多数人并不明白自由的真谛。自由就是有权决定计算机可以做什么,而获得这种自由的唯一方法就是了解计算机正在做什么;自由就是计算机没有秘密可言,只要你足够仔细,任何事情都可以找出答案。

为什么使用命令行

你有没有注意到,电影里的“超级黑客”(就是那些用不了半分钟就能侵入极为安全的计算机的人)端坐在计算机前时,从来都没碰过鼠标?这是因为制片人清楚,作为人类,我们从本能上就知道,要想在计算机上真正“搞定一切”的方式就是通过键盘输入命令!

如今的大多数计算机用户只熟悉图形用户界面(Graphical User Interface,GUI),甚至少数厂商和专家说命令行界面(Command Line Interface,CLI)是过去的玩意儿。这真遗憾,良好的CLI是一种极富表达力的人机交互方式,就像人们之间的书信交流一样。“GUI使简单的任务更简单,而CLI使完成艰难的任务成为可能。”这句话放到今天仍然正确。

由于Linux操作系统参照了UNIX系列操作系统,因此分享了UNIX丰富的命令行工具。UNIX操作系统在20世纪80年代早期就占据了主流地位(尽管它在20世纪70年代才被开发出来),GUI在当时尚未被广泛采用,因此诞生了大量的CLI。事实上,Linux的早期实践者选择Linux而非Windows NT的主要原因之一就是,其强大的CLI使“完成艰难的任务成为可能”。

这是一本什么样的书

这是一本全面讲述Linux命令行用法的图书。本书从更广泛的意义上向你传授如何使用CLI、CLI工作原理、CLI都有哪些功能,以及最佳实践是什么。

这不是一本有关Linux操作系统管理的图书。任何关于命令行的严肃讨论都会不可避免地转向操作系统管理方面的话题,本书仅触及少数管理问题。为了让你能开展后续的学习,本书提供了坚实的命令行基础知识,这可是完成重要的系统管理任务必不可少的工具。

本书以Linux为中心,只讨论当前的Linux发行版。尽管本书95%的内容对其他类UNIX系统用户也有帮助,但本书主要还是面向目前的Linux命令行用户。

学习本书的你

本书适合从其他操作系统转向Linux的新用户。你很可能曾是某一版Windows的“高手”;也可能是老板让你去管理Linux服务器,或是自己走进了像树莓派这样的单板计算机(Single Board Computer,SBC)的神奇新世界;又或者是厌烦了各种安全问题的桌面用户,想要体验Linux操作系统。这都无妨,欢迎阅读。

话虽如此,但万事开头难,学习命令行也不例外。学习命令行是一项挑战,需要付出辛勤的汗水。这倒不是说它有多难,而是它涵盖的内容着实广泛。在普通的Linux操作系统中,能够在命令行上使用的程序数以千计,这毫不夸张。先提醒你自己,学习命令行可不是件容易的事。

然而,学习Linux命令行所带来的回报颇丰。如果你觉得自己是“高手”,那么先等一等吧。你对真正的“力量”还一无所知。而且,不考虑其他的计算机技能,命令行知识是经久不衰的。你今天学到的知识在10年后仍旧管用。命令行知识经受得住时间的考验。

如果你没有编程经验,也不用担心,依然可以从本书开始学起。

内容编排

本书的内容经过精心编排,阅读时你会感觉就像有一位老师坐在身旁手把手地指导你。许多作者可能采用系统化的方法来讲解书中的内容。从我的角度来讲,这很合理,但是对初学者而言,可能会让人摸不着头脑。

本书的另一个目标是让你熟悉UNIX的思考方式,它不同于Windows的思考方式。在此过程中,我们还会帮助你理解命令行的工作原理和方式。Linux不仅仅是一个软件,还是庞大的UNIX文化中的一小部分,有自己的语言和历史。

本书包括4个部分,每一部分都涵盖了命令行不同方面的知识。

  • 第一部分:学习Shell。这部分开启命令行基础知识的学习之旅,包括命令结构、浏览文件系统、编辑命令行以及查找命令帮助和文档。
  • 第二部分:配置与环境。这部分讲述编辑配置文件,如何通过命令行的方式控制计算机操作。
  • 第三部分:常见任务与必备工具。这部分探讨很多在命令行上执行的常规任务。类UNIX系统,例如Linux,包含大量“经典的”命令行程序,可用于对数据执行强有力的操作。
  • 第四部分:编写Shell脚本。这部分介绍Shell编程,它是一项公认的基础技术,但并不难学,很多常见计算任务能借助其实现自动化。通过学习Shell编程,你会熟悉一些同样能够应用于其他编程语言中的概念。

如何阅读

从头读到尾。本书不是一本参考书,而更像是一本故事书,有开头,有过程,有结尾。

预备知识

为了阅读本书,你只需要安装好Linux操作系统。可以通过下列任意一种方式实现。

在计算机(不用是最新的)上安装Linux。无论选择哪个Linux发行版都没有问题,不过大多数人会从Ubuntu、Fedora、OpenSUSE中选择。如果你拿不准,就先试一试Ubuntu。安装现代Linux发行版时,由于硬件配置不同,要么简单至极,要么难得令人发指。建议采用近两年的桌面计算机,至少配备2GB的内存和6GB的空闲磁盘空间。尽可能避免使用笔记本计算机和无线网络,因为这二者经常难以正常工作。

使用LiveCD或U盘。许多Linux发行版有一个挺酷的功能,你可以直接通过CD-ROM或U盘运行Linux,完全不用安装。只需进入BIOS设置界面,将计算机设为从CD-ROM或USB设备启动,然后重启即可。使用这种方法可以在安装之前很好地测试硬件兼容性。缺点在于相较于在硬盘上安装的Linux,运行速度会比较慢。Ubuntu和Fedora(以及其他发行版)都有LiveCD版本。

不管你用哪种方式安装Linux,都会偶尔需要超级用户(也就是管理员)权限来完成本书中的某些任务。

安装好之后,就可以边读边练习了。本书的大部分内容需要你“亲自动手”学习。

为什么没有采用“GNU/Linux”的称谓

在某些群体中,将Linux操作系统称为“GNU/Linux操作系统”。其实不存在哪种称呼“Linux”的方式完全正确,因为它是由遍布世界各地的开发人员共同造就的。从技术层面来讲,Linux只是操作系统内核的名称,仅此而已。内核自然非常重要,没有它,操作系统就无法运转,但是它并不足以构成一个完整的操作系统。

理查德·马修·斯托曼是一位“天才哲学家”。他发起自由软件运动,成立了自由软件基金会,创建了自由软件项目并编写了GNU C语言编译器(GCC)的第一个版本,还制定了GNU通用公共许可证(GNU General Public License,GPL)等。他坚持将Linux称为“GNU/LINUX”,目的是准确地反映GNU项目对Linux操作系统做出的贡献。尽管GNU项目先于Linux内核出现,其贡献有目共睹,不容忽视。但是将GNU也加入名称中,对其他为Linux操作系统的发展做出巨大贡献的人来说是不公平的。除此之外,由于Linux内核先于其他程序启动,因此我觉得“Linux/GNU”这个名称在技术上更为准确。

在目前流行的名称中,“Linux”指代的是内核和在典型的Linux发行版中出现的所有其他自由和开源软件,也就是整个Linux生态环境,而不仅仅是GNU的组成部分。操作系统市场似乎偏好单个词的名称,例如DOS、Windows、macOS、Solaris、Irix、AIX。我也选择使用这个名称。但如果你更喜欢“GNU/Linux”,那么阅读时请在脑海中执行“查找—替换”操作。

第2版中的新内容

尽管基本结构和内容保持不变,但第2版其实做了各种改善、更新,并与时俱进,其中有很多是基于读者的反馈。除此之外,还有两处特别的改进。首先,本书现在假定使用Bash 4.x,该版本在初稿时并未广泛使用。Bash的4.x版添加了一些新特性,我们自然不会错过。其次,对本书第四部分进行了更新,提供了更好的脚本实践示例。第四部分中包含的脚本已经做出了修订,以使其更加稳健,同时我还修复了其中的几处错误。

欢迎反馈

就像许多开源软件项目一样,本书的创作也是一个永不止步的项目。如果你发现本书中的技术错误,请给我发送邮件(bshotts@users.sourceforge.net)。

请务必指明你正在阅读的书的确切版本。你的建议可能会被纳入将来的版本中。