深入理解Linux文本流( 二 )


想象一下敲击一个
代码如下:
$ls
键盘敲击的文本流(“ls\n” , \n是回车时输入的字符 , 表示换行)命令行 (命令行实际上也是一个程序) 。命令行随后调用/bin/ls得到结果(“a.txt”) , 最后这个输出的文本流(“a.txt”)流到屏幕 , 显示出来 , 比如说:
代码如下:
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
会在屏幕上返回错误信息 。因为此时标准错误依然指向屏幕 。当我们使用:
代码如下:
【深入理解Linux文本流】 $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
》 ,  》》 ,  《 ,  |

推荐阅读