shell快讲第二节--管道与重定向

shell快讲第一节--shell基础
shell快讲第二节--管道与重定向
shell快讲第三节--正则表达式
shell快讲第四节--sed与awk
shell快讲第五节--shell语法基础
shell快讲第六节--shell函数编程
shell快讲第七节--shell编程规范与调试
shell快讲第八节--shell编程实战

管道

严格的说管道属于IO重定向的一部分,但是我们不思考那么多,管道在Shell操作中经常遇到,管道符号是“|”,它是我们在命令与命令之间(或者说进程与进程之间)通信的一种手段,我们先看下原理


shell快讲第二节--管道与重定向_第1张图片
guandao.png

我们实际来操作一下:

>>> ls -l |grep *.png |wc -l #查找当前目录的所有文件中的png文件并输出它们的数量
>>> cat testfile |grep error #过滤某个文件中的包含错误信息的行

重定向

类型 文件描述符 默认情况 对应设备位置
标准输入 0 从键盘获得输入 /dev/stdin
标准输出 1 输出到控制台 /dev/stdout
错误输出 2 输出到控制台 /dev/stderr

1.STDIN

stdin代表shell的标准输入,对终端来说,标准输入就是键盘,默认定向到控制台,当然我们可以使用“<”符号定向到其他地方作为stdin输入(累次开发中的生产消费模式),当然必须注意不是所有的命令都可以接收stdin输入。如下例子:

#测试输入,cat可以接受stdin的输入并把内容打印出来
>>> cat #随便输入点什么
stdin效果演示
#将某个文件作为stdin输入给cat命令使用
>>> echo "hello world" > testfile #创建testfile文件并保存一段话
>>> cat < testfile #讲testfile作为cat的输入

另外我们可以使用“<<”进行追加模式的stdin输入,相对于"<",“<<”我们更加常用:

>>> cat >testfile <你好
>hello world
>EOF
#此时生成一个testfile文件,我们打开它
>>> cat testfile
#没错,这就是上节课的例子

2.STDOUT

stdout代表shell的标准输出,输出到终端显示器,shell和程序的绝大多数输出都是标准输出,默认是输出到控制台,当然我们可以使用“>”重定向到其他地方,">>"是它的追加模式

>>> ls -l #标准输出
>>> ls -l >test1 #输出到test1里面
>>> echo "追加文档到test1" >> test1

3.STDERR

shell对于错误消息的处理和普通的输出是分开的,某些开发写的程序不标准,经常会把标准输出和标准错误输出弄混,然后运维就更辛苦点了。标准错误输出和标准输出一样都是默认输出到控制台的。stderr的默认输出虽然是控制台但是却不会被“>”符号重定向,我们看个例子:

>>> ls -l ajflajfa >testfile #讲ajflajfa文件的属性输出到testfile里面,但是ajflajfa根本不存在
>>> cat testfile #查看文件

实验过后其实会发现stderr的输出不会像stdout那样被重定向到textfile里面,但是在日常工组中,我们会有要求把所有的正常的日志输出,非正常的日志输出都放在一个文件里面

#将标准输出,标准错误输出均输入到一个文件里面
>>> ls -l test1 test2 >testfile 2>&1  #test1存在,test2不存在,或:
>>> ls -l test1 test2 &>testfile #另外一种写法
>>> cat testfile
>>> ls -l test1 test2 2>errout 1>output #错误信息输出到errout 正确的信息输出到output

如下是符号的重定向对比列表

符号 说明
> 把stdout(标准输出)重定向到文件,文件内容会被覆盖
>> 把stdout(标准输出)重定向到文件,内容追加到文件的末尾
2> 把stderr(标准错误输出)重定向到文件,文件内容会被覆盖
2>> 把stderr(标准错误输出)重定向到文件,内容追加到文件末尾
2>&1或&> 把stdout和stderr作为一个数据流重定向到文件,文件内容会被覆盖
&>> 把stdout和stderr作为一个数据流重定向到文件,内容追加到文件末尾
< 将文件重定为stdin
<< 作为stdin输入的文件可以被追加,不过需要使用EOF作为文件的截断符号

重定向在接下来的章节会比较长用到,这里列几个基于管道的命令工具传送门,这些工具大家自己练习

总结

希望大家结合自己的工作场景练习上面的命令,如果有开发基础,理解std并不困难,不过有无开发基础都不妨理解管道这个概念。

你可能感兴趣的:(shell快讲第二节--管道与重定向)