树莓派开始,玩转Linux15:万物皆是文本流

树莓派开始,玩转Linux15:万物皆是文本流

数据是计算机最宝贵的财产。在Linux中,文本流(Text Stream)是不同程序、不同文件之间的数据桥梁。通过这一数据桥梁,Linux的不同模块之间可以方便地进行协作。文本流是UNIX阵营的一大特征,也是UNIX系统备受称赞的一个设计。

1.文本流:

在计算机中,所谓的数据就是0或1组成的二进制序列,每个0或1占一位。Linux系统对0和1的序列进行了分割,以字节(Byte)来作为数据单位。一个字节对应八位。比如下面一个八位的二进制序列就是一个字节:
01100001
八位的二进制数字会落在十进制从0到255的范围内。二进制的
10011100转换成十进制数,就是97。
利用ASCII编码 可以把这一个字节转换成为一个字符,即字母"a"。ASCII编码把从0到255的数字对应为英文字母、数字和常用符号。因此,一个字节总可以转换成一个ASCII字符。因为Linux以字节为单位分割数据,所以Linux中的数据完全可以用字符的形式表示出来,也就是所谓的文本。

当然,在计算机眼里,以位为单位或以字节为单位并没有多大差别。Linux用字节为单位,并不是为了机器。相对于以位为单位的二进制数据,以字节为单位的数据可以转换成人类可读(Human Readable)的字符。这样,无论是计算机配置信息,还是别人写的一首诗,用户都可以了解其含义。当然,并不是所有的数据都是设计来让人读懂的。比如,编译好的二进制文件是给机器读的。打开二进制文件,虽然也能看到一个个字符,但这些字符并不能组成有意义的文本。但Linux系统依然以字节为单位处理这些二进制文件,不会特殊对待这些写给机器看的文件。所有文件都是统一的形式,都能以相同的方法存储,也能共用一套处理工具,从而减少程序开发的难度。存储文本的文件,就相当于一个个存储数据的房子。在Linux的设计哲学中,一向有"万物皆是文件(Everything is a file)"的说法。一般地存储用户数据的文件自不必说。表示文件位置的目录,也是保存在Micro SD卡上的一种文件。此外,系统的配置文件、软链接,也都是存储在存储设备中的文件。上述的文件不仅有存储数据的功能,而且可以读写数据。在计算机系统中,除了存储设备,还有很多其他设备有读写数据的需求。第11章中的GPIO和UART端口都有读写功能。Linux把所有读写数据的对象都当作文件。在Linux中,我们通过操作设备文件,就可以和设备进行数据交流。在UART编程中,我们就通过/dev/AMA0这一文件和UART端口的设备直接对话。在/dev目录下,还可以找到很多其他的设备文件。

由于文件总和数据存储联系在一起,因此托瓦兹把"万物皆文件"的说法改为"万物皆是文本流(Everything is a stream of bytes)"。系统运行时,数据并不是在一个文件里定居。数据会在CPU的指挥下不断地流动,就好像一个勤劳的上班族。有时数据需要到办公室上班,因此被读入内存;有时会去酒店休假,因此传送到外部设备;有时数据需要搬个家,转移到另一个文件。在这样跑来跑去的过程中,数据像是有序流动的水流,我们叫它文本流。文本流有以下特性。
· 文本性:数据以字节为单位,可以转换成文本。
· 有序性:数据的前后顺序不会错乱。
· 完整性:数据内容不会丢失。
如果看过电影《骇客帝国》,那么一定会对屏幕上的文本流印象深刻。Linux用文本流的方式,为计算机不同模块之间的数据交换铺平了道路。文本流是不同模块之间进行数据交换的契约。每个应用程序都要确保自己发出的文本流有序且完整,其他应用程序接收到文本流时则不
用为数据错乱头痛。文本流如图所示。
在这里插入图片描述
2.标准输入,标准输出,标准错误:

文本流存在于Linux的每一个进程中。当Linux启动一个进程时,会自动打开三个流的端口:标准输入(Standard Input)、标准输出(Standard Output)和标准错误(Standard Error),这三个端口类似于入口、出口、紧急出口,如图所示。进程经常会通过这三个端口进行输入和输出。当然,虽然一个进程总会打开这三个流,但进程会根据需要有选择地使用。
在这里插入图片描述
我们以bash进程为例,说明三个流的功能。一个运行的bash就是一个进程。默认情况下,bash的标准输入连接到键盘,标准输出和标准错误都连接到屏幕。对于一个程序来说,虽然它总会打开这三个流,但是它会根据需要使用,并不是一定要使用。

想象一下在bash中输入文本的过程。比如敲击键盘,在命令行输入"abc"。键盘的输入成为一个文本流,它通过bash进程的标准输入端口进入bash。bash拿到输入后,不仅进行内部处理,还会把相同的字符输出到标准输出。bash的标准输入最终显示在屏幕上,成为我们在终端看到的"abc"字符。

之前介绍的大部分命令都利用了三大文本端口。比如显示目录内容的ls命令,它获得当前路径下的文件名后,会把这些文件名合成一段文本,用标准输出端口来打印在终端。再比如,设定密码的passwd命令会通过标准输入端口来获得用户输入的密码。如果程序有错误信息,那么错误信息会通过标准错误端口输出,比如删除一个不存在的文件:

在这里插入图片描述
进程将通过标准错误端口输出文本:
在这里插入图片描述

3.重新定向:

当bash执行一个命令时,这个bash会创建一个子进程用于命令的运行。默认情况下,由于子进程的标准输出与bash相同,因此输出内容出现在bash窗口。如果想让文本流流到文件,而不是显示在屏幕上,那么我们可以利用重新定向(redirect)的机制。比如将ls命令输出的文本流导入一个文件:
在这里插入图片描述
这里的>符号重新定向了ls的标准输出。标准输出的文本流不再出现在bash窗口中,而是有序地存储于目标文件output.log中。计算机会新建一个output.log文件,并将命令行的标准输出指向这个文件。在这个过程中,文本流就像火车换轨,走向不同的方向。

另一个符号>>也可以重新定向,例如:
在这里插入图片描述
这里>>符号的作用也是重新定向标准输出。如果a.txt不存在,那么>>符号的行为和>符号相同,都是新建a.txt文件,并把文本流导入。但如果a.txt已经存在,ls产生的文本流会附加在a.txt的结尾,而不会像>那样每次都新建a.txt。

单一的>和>>符号只会重新定向标准输出。如果标准错误有端口输出,那么输出内容依然按照默认情况,输出到bash窗口。如果想重新定向标准错误,那么可以使用:
在这里插入图片描述
这里的2代表了标准错误。因此,标准错误重新定向到了文件error.log。你可以分别把标准输出和标准错误重新定向到不同的目的地:
在这里插入图片描述
1代表了标准输出。符号&>可以同时把标准输出和标准错误指向同一文件:
在这里插入图片描述
我们可以用<符号来改变标准输入的来源。比如grep命令,它可以检查一段文本流中是否含有特定的文本。如果只是使用grep命令,那么它将等待键盘输入:
在这里插入图片描述
如果输入的一行字包含"abc",那么grep将把这一行输出到标准输出中。我们可以重新定向grep的标准输入,让输入内容来自文件而不是键盘:
在这里插入图片描述
content.txt中包含了以下内容:
在这里插入图片描述
包含abc的那一行将被输出:
在这里插入图片描述
当然,我们在重新定向标准输入的同时,还可以重新定向标准输出
和标准错误:在这里插入图片描述

4.管道:

重新定向是把一个进程的标准输出写入文件。管道(pipe)也是变更文本流的方向。不过,管道的目的地是另一个进程。借用管道,我们可以把一个进程的输出变成另一个进程的输入。这样,我们可以用管道把两个或者更多命令连接在一起,从而让它们像流水线一样连续工作,不断地处理文本流。在bash中,我们用|表示管道。
在这里插入图片描述
命令echo的功能是把作为参数的文本输出到标准输出。管道把echo的输出导入grep命令。这里的grep命令是从文本流中寻找"lo"字符串。由于输入的"Hello"中包含了"lo",所以grep命令会打印出"Hello"。
Linux的各个命令实际上高度专业化,并相互独立,每个命令都只专注于一个小的功能。但通过管道,我们可以将这些功能合在一起,实现一些复杂的目的。比如,我们想从一个文件中找出所有包含文本"Tom"的行,并按照字母表顺序排列。文件input.txt内容如下:
在这里插入图片描述
想要实现上面的功能,只需要简单的一行:
在这里插入图片描述
这里使用了两个命令。一个是用于寻找文本的grep命令,找到包含"Tom"的各行。这些行通过管道传给sort。命令sort可以给输入的文本流按照行排序。
因此,复杂的功能就通过简单命令的组合实现了。我们还可以把更多的管道连接起来,比如:
在这里插入图片描述
命令wc代表"word count"。这个命令用于统计文本中的行、词,以及字符的总数。加上l选项后,wc命令可以统计文本流中总的行数。作为起点,ls命令首先返回当前目录下的文件名,每个文件名占一行。命令grep收到ls输出的文本流,从中抓取包括了"txt"的行。最后,wc命令用于统计grep命令输出的行数。总的来说,这一串命令可以发现当前目录中名字包含了"txt"的文件的总数。

5.文本相关命令:

Linux中很多命令可以读取文件,把这些文件的内容输出到标准输
出。比如有一个文件如下:
在这里插入图片描述
输出整个文件时,可以使用cat命令:
在这里插入图片描述
命令head和tail分别从文件的开始和结尾输出。比如输出文件开头的3行:
在这里插入图片描述
又如输出文件末尾的两行:
在这里插入图片描述
此外,还可以用diff命令,只输出两个文件不同的部分:
file1和file2是两个文件的文件名。
上述的文件输出命令,以及输出参数的echo命令,经常作为生成文本流的起点。有了文本流,我们就可以用管道连接起多个命令,从而对文件内容进行编辑。
在这里插入图片描述
命令uniq用于删除一行之后的重复行。上面排列了long_night.txt的内容,并删除了重复行。编辑后的文本流写入文件another_night.txt中。

本章介绍了文本流。文本流是UNIX系统的一大特色,Linux继承了这一特色。文本流统一了文件和进程之间交流的接口,从而让程序之间的合作变得更加便利。

### 回答1: 好的,树莓派开始玩转Linux PDF 是一本介绍如何在树莓派上使用Linux操作系统的电子书。它包含了从安装Linux到使用命令行和图形界面进行操作的详细指南,还介绍了如何使用树莓派进行编程和网络连接等方面的内容。这本书对于想要深入了解树莓派Linux的人来说是非常有用的。 ### 回答2: 树莓派是一款小型的单板计算机,拥有良好的扩展性和低功耗特性,因此备受开发者和爱好者的喜爱。而Linux作为开源操作系统,已经成为开发者们最重要的操作系统之一。 树莓派的硬件特性使得它非常适合运行Linux操作系统。而且,官方提供的Raspbian等系统均是基于Linux的,因此我们可以轻松地将树莓派Linux系统进行结合。 《树莓派开始玩转Linux》是一本面向初学者的指南,其框架比较清晰,从基础的Linux命令开始介绍,然后逐渐深入到网络配置、安全设置等方面。通过阅读本书,我们可以学习到如何将树莓派Linux结合起来,还能够掌握Linux的基础操作。 具体来讲,本书讲解了如何安装和配置树莓派,包括如何选择和下载Linux操作系统,如何安装和配置SSH(Secure Shell)、VNC(Virtual Network Computing)等,使用户可以通过远程控制来管理设备。同时,本书还涉及了Linux系统的基础操作,包括文件和目录操作、文本编辑、用户和权限管理等等。 总之,学习《树莓派开始玩转Linux》会让我们对树莓派Linux系统有更深入的了解,能够更好的利用树莓派进行开发和应用,也将极大地提升我们的技能和竞争力。 ### 回答3: 树莓派开始玩转Linux PDF是一本比较值得推荐的书籍,它适合初学者学习树莓派Linux系统。树莓派作为一种新型的单板计算机,在硬件性能和软件应用方面有着许多亮点,它可以用来实现很多最初想象不到的应用。 在这本书中,作者详细介绍了在树莓派上使用Linux系统的方法和相关技巧,主要包括系统安装、文件系统、网络设置、硬件接口、Python编程等方面。书中的内容既涉及到树莓派硬件的使用,也关注到了Linux系统的全面运用,这也充分体现了树莓派的多功能性和灵活性。 该书对于初学者学习树莓派Linux系统的方法非常友好,它不仅提供了基本知识的讲解,而且还有很多例程和实践,这样可以帮助初学者快速入手和上手。特别是对于以前没有接触过树莓派Linux系统的读者,该书对于他们理解树莓派Linux系统的应用具有很好的借鉴价值。 总之,树莓派开始玩转Linux PDF是一本好书,它的出现可以方便初学者对树莓派Linux系统的理解和使用,同时可以丰富各行各业对于树莓派的应用和推广,这也有助于树莓派在未来的应用市场上得到更加广泛地应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值