1):基本概念
原始数据从一端进入,然后接着一个程序对数据进行处理,直到另一端,数据以结果形式出现。shell 允许创建一序列命令,命令(也可以是脚本)用’|’ 分隔开来,代表一个程序的标准输出(不包含有标准错误)可以 自动地发送给 下一个程序的标准输入。
阅读方式为: 从左到右的方式 读取。
两个程序之间的连接’|’ 就是 “管道” , “命令序列”称为 管道线。
编写习惯:
当编写 管道线的时候, ‘|’ 元字符的两边其实没必要加上空格,
但是, 应当加上空格。
可以使得键入的错误发生几率最小,并使得命令可阅读性增强。
2):组合标准错误。
默认情况下,只是将标准输出发送给下一个程序的标准输入。
还可以将标准输出和标准错误组合一起当做另一个程序的标准输入。
# bourne shell家族:command1 2>&1 | command2ls -l file1(不存在文件) file2 2>&1 | sort
–注意一个现象:
标准错误会比标准输出 先前打印。
这是为什么呢?
因为,在默认情况下,stdout是行缓冲的,它的输出会放在一个buffer里面,只有到换行的时候,才会写出。而stderr是无缓冲的,会直接输出,举例来说就是printf(stdout, “xxxx”) 和 printf(stdout, “xxxx\n”),前者会憋住,直到遇到新行才会一起输出。而printf(stderr, “xxxxx”),不管有么有\n,都输出。
3):过滤器(filter)
当创建管道线的时候,必须使用“能够从标准输入读取文本数据,并向标准输出写入文本数据的程序” 。 这样的程序就是 “过滤器”,且Unix上有很多过滤器。
管道线上的 过滤器 可以任意多,数量的唯一限制,就是对知识的掌握。
4):一个不得不说的命令。
因为管道线的正常I/O是从标准输出到标准输入这种单一模式,
而tee作用是 “从标准输入读取数据” , 并向’标准输出’和’一个或多个文件’ 发送同样一份数据,从而可以多个分支I/O。
语法:
tee [-a(追加模式)] file(希望保存数据的文件) | 1. tee 的输出保存不止一份副本。 2. tee 指定的文件不存在,将 新创建该文件。 3. tee 指定的文件已经存在,tee将重写覆盖该文件。 4. tee 使用-a选项将在文件末尾追加数据,而不是替换文件。$ cat names1 name2 name3 | tee f1 f2 |grep 'man'
–技巧:
一种常用的使用模式:将数据保存到文件中的同时,发送到屏幕(标准输出)。
$ who 2>&1 | tee file | less
tee 就相当于将 一份数据流引导成两份一样的数据流,流向不同的方向。
5):终止管道线
终止一个正在运行的管道线,请发送: ^C 信号。
当管道线中的一个程序终止时,其他程序就不会正常运行了。
掌握Unix的基本技能之一就是:”学会如何将程序组合成管道线去解决问题”。
联系客服