深入理解Linux文本流

等吥到妳的愛

等吥到妳的愛

2016-02-19 20:10

给自己一点时间接受自己,爱自己,趁着下午茶的时间来学习图老师推荐的深入理解Linux文本流,过去的都会过去,迎接崭新的开始,释放更美好的自己。

相信很多人都知道什么是系统文件,但很少人知道文本流是什么,其实文本流不难理解,下面图老师小编就给大家详细介绍下Linux文本流,一起来学习下吧。

文本流

文件用于数据的存储,相当于一个个存储数据的房子。我们之前说,所谓的数据是0或者1的序列,但严格来说,Linux以字节(byte)来作为数据的单位,也就是说这个序列每八位(bit)为一个单位(八位二进制对应的十进制范围为0到255)。使用ASCII编码,可以将这样一个字节转换成为字符。所以,在Linux中,我们所说的数据,完全可以用字符表达出来,也就是说文本(text)的形式。

实际上,如果以bit为单位处理字符的话,机器会更容易读懂和传输,效率会更高。但为什么Linux依然以字节为单位进行处理呢?原因在于,相对于以bit为单位处理数据,以byte为单位可以更容易将数据转化为字符。相对于枯燥的0和1,字符更容易被人读懂 (human readable)。然而,并不是所有的数据都是设计来让人读懂的,比如可执行文件包含的各种字符对于人来说并没有什么意义 (因为可执行文件是为了让机器读懂的)。但Linux依然以字节为单位处理所有文件,这是为了让所有文件能够共用一套接口 (virtual file system),从而减少Linux设计的复杂度。

(everything is a file是通常所流传的UNIX设计的哲学之一,但Linus对此作出纠正,改为everything is a stream of bytes。)

然而,数据不是在找到了自己的房子(file)之后就永远的定居下来。它往往要被读入到内存 (就像是到办公室上班),或者被传送到外部设备(好像去酒店休假),或者搬到别的房子中。在这样的搬迁过程中,数据像是一个个排着队走路的人流,我们叫它文本流(text stream,或者byte stream)。然而,计算机不同设备之间的连接方法差异很大,从内存到文件的连接像是爬山,从内存到外设像是游过一条河。为此,Linux还定义了流 (stream),以此作为修建连接各处的公路的标准。Stream的好处在于,无论你是从内存到外设,还是从内存到文件,所有的公路都是相同的 (至于公路下面是石头还是土地,都可以不用操心)。

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/diannaorumen/)

我们再回味一下everything is a stream of bytes这句话。信息包含在文本流中,不断在计算机的各个组件之间流动,不断地接受计算机的加工,最终成为用户所需要的某种服务。

(说句题外话,如果看过骇客帝国的话,一定会对文本流印象深刻。)

 深入理解Linux文本流

标准输入,标准输出,标准错误与重新定向

当Linux执行一个程序的时候,会自动打开三个流,标准输入(standard input),标准输出(standard output),标准错误(standard error)。比如说你打开命令行的时候,默认情况下,命令行的标准输入连接到键盘,标准输出和标准错误都连接到屏幕。对于一个程序来说,尽管它总会打开这三个流,但它会根据需要使用,并不是一定要使用。

想象一下敲击一个

代码如下:

$ls

键盘敲击的文本流(lsn,n是回车时输入的字符,表示换行)命令行 (命令行实际上也是一个程序)。命令行随后调用/bin/ls得到结果(a.txt),最后这个输出的文本流(a.txt)流到屏幕,显示出来,比如说:

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/diannaorumen/)

代码如下:

a.txt

假设说我们不想让文本流流到屏幕,而是流到另一个文件,我们可以采用重新定向(redirect)的机制。

代码如下:

$ls 》 a.txt

重新定向标准输出。这里的》就是提醒命令行,让它知道我现在想变换文本流的方向了,我们不让标准输出输出到屏幕,而是要到a.txt这个文件 (好像火车轨道换轨)。此时,计算机会新建一个a.txt的文件,并将命令行的标准输出指向这个文件。

有另一个符号:

代码如下:

$ls 》》 a.txt

这里》》的作用也是重新定向标准输出。如果a.txt已经存在的话,ls产生的文本流会附加在a.txt的结尾,而不会像》那样每次都新建a.txt。

我们下面介绍命令echo:

代码如下:

$echo IamVamei

echo的作用是将文本流导向标准输出。在这里,echo的作用就是将IamVamei输出到屏幕上。如果是

代码如下:

$echo IamVamei 》 a.txt

a.txt中就会有IamVamei这个文本。

我们也可以用《符号来改变标准输入。比如cat命令,它可以从标准输入读入文本流,并输出到标准输出:

代码如下:

$cat 《 a.txt

我们将cat标准输入指向a.txt,文本会从文件流到cat,然后再输出到屏幕上。当然,我们还可以同时重新定向标准输出:

代码如下:

$cat 《 a.txt 》 b.txt

这样,a.txt的内容就复制到了b.txt中。

我们还可以使用》&来同时重新定向标准输出和标准错误。假设我们并没有一个目录void。那么

代码如下:

$cd void 》 a.txt

会在屏幕上返回错误信息。因为此时标准错误依然指向屏幕。当我们使用:

代码如下:

$cd void 》& a.txt

错误信息被导向a.txt。

如果只想重新定向标准错误,可以使用2》:

代码如下:

$cd void 2》 a.txt 》 b.txt

标准错误对应的总是2号,所以有以上写法。标准错误输出到a.txt,标准输出输出到b.txt。

管道 (pipe)

理解了以上的内容之后,管道的概念就易如反掌。管道可以将一个命令的输出导向另一个命令的输入,从而让两个(或者更多命令)像流水线一样连续工作,不断地处理文本流。在命令行中,我们用|表示管道:

代码如下:

$cat 《 a.txt | wc

wc命令代表word count,用于统计文本中的行、词以及字符的总数。a.txt中的文本先流到cat,然后从cat的标准输出流到wc的标准输入,从而让wc知道自己要处理的是a.txt这个字符串。

Linux的各个命令实际上高度专业化,并尽量相互独立。每一个都只专注于一个小的功能。但通过pipe,我们可以将这些功能合在一起,实现一些复杂的目的。

总结

文本流,标准输入,标准输出,标准错误

cat, echo, wc

》, 》》, 《, |

上面就是Linux文本流的详细介绍了,本文主要介绍了标准输入、标准输出、标准错误和重定向,那么你对Linux文本流有一定的了解了吗?

展开更多 50%)
分享

猜你喜欢

深入理解Linux文本流

电脑入门
深入理解Linux文本流

Linux系统进程深入理解

服务器
Linux系统进程深入理解

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

深入理解 ViewState

Web开发
深入理解 ViewState

深入理解sizeof

C语言教程 C语言函数
深入理解sizeof

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

android ListView深入理解

编程语言 网络编程
android ListView深入理解

java 递归深入理解

编程语言 网络编程
java 递归深入理解

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

在VC6中编写可在XP中显示XP风格界面的程序

在VC6中编写可在XP中显示XP风格界面的程序

人生就该这样

人生就该这样
下拉加载更多内容 ↓