带你读《Linux哲学》之三:数据流
点击这里查看第一章:Linux哲学简介点击这里查看第二章:准备 第二部分 基 础■第3章 数据流■第4章 转换数据流■第5章 一切都是文件■第6章 使用Linux FHSLinux命令行有很多功能,用户可以充分利用它做许多事情。当今的图形用户界面(GUI)使得某些人无须使用命令行,对于许多只想使用一些相对简单的工具来浏览网页、使用电子邮件以及阅读或书写文档的人来说,确实如此。大多数Linux用户无法想象GUI背后隐藏的力量。然而,与其他情况相比,允许更多用户轻松访问计算机功能的GUI隐藏了这台计算机为我们提供的大部分功能。有一类人特别倾向于成为命令行的主要用户:系统管理员,即负责管理系统的人员。系统管理员是命令行的最终用户,因为命令行可以直接访问全部范围的功能。这并不是说普通的非root用户不使用命令行。许多人都会使用命令行,但通常是在GUI没有满足他们需求的能力时才这样做。大多数Linux发行版都有用于安装程序、管理用户和组及其权限、移动和管理文件、处理邮件、浏览网页、管理进程和CPU功能、限制某些用户访问系统资源,以及更多功能的图形工具。但是,如果命令行界面(CLI)的临时用户深入探索下去,他们会发现Linux提供了许多文本模式和命令行工具来执行可以在GUI中执行的每项任务和不能用GUI完成的许多任务,而且通常运行速度更快,功能更多。作为系统管理员,我的需求包括功能、速度、灵活性和对操作系统的完全控制。满足所有这些需求的唯一方法是不受限制地访问Linux命令行,这样可以把所有这些功能和速度都显露出来。我发现自己管理任务时使用CLI的频率远远高于使用GUI。这在很大程度上是因为我更喜欢CLI,但也有许多Linux计算机没有安装任何类型的GUI,甚至那些具备GUI的计算机在试图通过任何远程桌面工具执行远程管理时也非常慢。如果你与远程计算机的Internet连接速度非常快,那么这些远程GUI工具会很有用,但它们永远不会像老式的终端会话一样快,因为GUI数据的网络开销会占用大量带宽。我并不是说我不使用GUI桌面而且它们“糟糕”。事实上,GUI桌面可以提高我在CLI上的工作效率。我通过同时打开多个终端会话来利用GUI访问CLI,从而使我能够同时访问多个Linux主机上的多个用户的CLI。我在GUI桌面上使用图形工具。我正在使用LibreOffice Writer—一个功能强大的免费开源图形化文字处理程序来写作本书。我很欣赏并使用CLI和GUI来发挥各自的优势。但是,Linux的真相是CLI为那些愿意使用它的人提供了最强大的功能。本部分将介绍Linux系统管理员哲学的基础原则。这些原则是Gancarz著作中记载的Unix/Linux哲学原理的发展体现,我们将在这部分中看到更多基础原则。对Unix以及Linux的基本设计的哲学方法有助于实现这两个操作系统的稳定性、优雅性、简单性和强大的功能。这不是偶然的。Linus Torvalds起初把开发Linux作为业余爱好来做,但故意以Unix为基础来开发它。他接受了免费提供的GNU 实用程序,然后为Linux重新编译它们,并将它们添加到他的操作系统中,当它们组合在一起时,被纯粹主义者称为GNU/Linux。任何操作系统的个性和可用性都是由设计者所做出的假设决定的。Linux也不例外。它的设计从一开始就像Unix一样,Unix开发人员已经决定Unix允许用户使用融入它的设计中的每一部分功能。不仅如此,他们还为用户提供了使用该功能所需的工具。毕竟,设计出一个操作系统(或者其他任何事情),然后却限制对它的使用没有意义。GNU/Linux是Free Libre开源软件(FLOSS),在其理念和实现方面与Unix非常相似。由于它们对Linux个性的重要性和广泛影响,我在本书中花费了大量文字来解释这些基础原则,并通过动手实验来说明它们。我相信,只有对这些原则有了坚实的理解,才能理解功能原则,才能更加完全地实现它们对系统管理员的日常任务的适用性。 第3章 数据流Linux中的所有内容都围绕着数据流(特别是文本流)展开。我最近使用Google搜索“数据流”,大多数热门内容都涉及处理单个实体(如流媒体视频和音频)中的大量流数据,或由大量个别交易组成的金融机构处理流程。这些都不是我们要在这里讨论的数据流,虽然它们的概念是相同的,并且可以说当前的应用程序正是使用Linux的流处理功能作为处理许多数据类型的模型。在Unix和Linux世界中,流是指源自某个来源的流文本数据,流可以流动到一个或多个以某种方式对其进行变换的程序,然后它可以存储在文件中或显示在终端会话中。系统管理员的工作与操纵这些数据流的创建和流动密切相关。本章将探讨数据流—它们是什么,如何创建它们,以及它们的一些用法。 3.1 文本流—通用接口 使用标准输入/输出(STDIO)进行程序输入和输出是Linux工作方式的关键基础之一。STDIO最初是为Unix开发的,从那时起它已经进入大多数其他操作系统,包括DOS、Windows和Linux。这就是Unix的哲学:编写程序,让它只做一件事并且做好。编写程序以协同工作。编写程序来处理文本流,因为这是一个通用接口。—Doug McIlroy,Unix哲学基础STDIO由Ken Thompson开发,作为在早期版本的Unix上实现管道所需的基础结构的一部分。实现STDIO的程序使用标准化的文件句柄,而不是存储在磁盘或其他记录介质上的文件来进行输入和输出。STDIO最好被描述为缓冲的数据流,其主要功能是将数据从一个程序、文件或设备的输出,用流的方式传输到另一个程序、文件或设备的输入。 3.2 STDIO文件句柄 STDIO数据流有三种,每种数据流都在那些使用STDIO的程序启动时作为文件自动打开。每种STDIO数据流都与一个文件句柄相关联,文件句柄只是一组描述文件属性的元数据。文件句柄0、1和2按照约定及长期实践分别显式定义为STDIN、STDOUT和STDERR。STDIN,文件句柄0,是标准输入,通常从键盘输入。STDIN可以从任何文件重定向,包括设备文件而不是键盘。重定向STDIN比STDOUT或STDERR更不常见,但它可以很容易地完成。STDOUT,文件句柄1,是标准输出,默认情况下将数据流发送到显示器。通常将STDOUT重定向到文件或将其传送到另一个程序以进行进一步处理。STDERR与文件句柄2相关联,STDERR的数据流通常也会发送到显示器。如果将STDOUT重定向到文件,则STDERR将继续显示在屏幕上。这确保了当数据流本身没有显示在终端上时,STDERR仍然显示在终端上,从而确保用户可以看到程序执行导致的任何错误。STDERR也可以重定向到相同的文件或传递给管道中的下一个转换器程序。STDIO实现为C库,可以将stdio.h包含在程序源代码中,以便它可以被编译进生成的可执行文件中。 3.3 生成数据流 大多数核心实用程序(Core Utility)都使用STDIO作为其输出流,而那些生成数据流而不是以某种方式转换数据流的程序,可用于创建我们将用于实验的数据流。数据流可以短至一行甚至一个字符,只要符合需要。让我们尝试第一个实验并创建一个简短的数据流。 在第4章,我们将这样的STDOUT数据流传输到某些转换器程序的STDIN,以便对流中的数据执行某些操作。目前,我们只是生成数据流。一些GNU核心实用程序专门用于生成数据流。 […]