重定向和管道

目标

  通过shell重定向将命令输出或错误保存到文件中,并利用管道通过多个程序处理命令输出。

名词定义

  • 标准输入、输出和标准错误

  一个运行的程序(或称为进程)需要从某位置读取输入并将输出写入某位置。从shell提示符运行的命令通常会从键盘读取其输入,并将输出发送到其终端窗口。

  进程使用称为文件描述符的编号通道来获取输入并发送输出。所有进程在开始时至少要有三个文件描述符。标准输入(通道0)从键盘读取输入。标准输出(通道1)将正常输出发送到终端。标准错误(通道2)将错误消息发送到终端。如果程序打开连接至其他文件的单独连接,则可能要使用更大编号的文件描述符。


标准输入与输出

 

  • 通道(文件描述符)
编号 通道名称 描述 默认连接 用法
0 stdin 标准输入 键盘 仅读取
1 stdout 标准输出 终端 仅写入
2 stderr 标准错误 终端 仅写入
3+ filename 其他文件 读取和/或写入

 

  • 将输出重定向到文件

  I/O重定向可更改进程获取其输入或输出的方式。该进程并不从键盘获取输入,也不是将输出和错误发送到终端,而是执行文件读取或写入。重定向允许您将消息保存到通常发送给终端窗口的文件中。或者,您也可以使用重定向来丢弃输出或错误,这样他们就不会显示在终端上或保存下来。

  重定向stdout可以组织进程输出显示在终端上。仅重定向stdout不会阻止stderr错误消息显示在终端上。如果文件不存在,则会创建文件。如果文件确实存在,但是所需的重定向没有附加到文件,则该文件的内容将被覆盖。

  如果想丢弃消息,特殊文件/dev/null以静默方式丢弃重定向到其自身的通道输出,并且始终是空文件。

 

  • 构建管道

  管道是一个或多个命令的序列,用竖线字符(|)分隔。管道将第一个命令的标准输出连接到下一个命令的标准输入。

在某个进程输出到终端之前,管道允许另一个进程操作和格式化该进程的输出。为便于理解,可以这样想象一下:数据正在通过管道从一个进程流向另一个进程,并且在其流过的管道中每个命令都会略微对其做些改动。

实操演示

[root@jenkins ~]# echo $(date) > time
[root@jenkins ~]# cat time
20220129日 星期六 09:16:17 CST
##标准输出重定向到time文件

[root@jenkins ~]# echo $(date) >> time
[root@jenkins ~]# cat time
20220129日 星期六 09:16:17 CST
20220129日 星期六 09:16:24 CST
##标准输出追加到time文件

[root@jenkins ~]# ls 8 2> time
[root@jenkins ~]# cat time
ls: 无法访问8: 没有那个文件或目录
##标准错误输出重定向到time文件

[root@jenkins ~]# (date ; ls /sdf) >time 2>&1
[root@jenkins ~]# cat time 
20220129日 星期六 09:22:45 CST
ls: 无法访问/sdf: 没有那个文件或目录
##将标准输出和标准错误输出重定向到time文件

[root@jenkins ~]# (date ; ls /sdf) &>time
[root@jenkins ~]# cat time
20220129日 星期六 09:24:28 CST
ls: 无法访问/sdf: 没有那个文件或目录
##将标准输出和标准错误输出重定向到time文件,可以只使用&字符

[root@jenkins ~]# netstat -anput | wc -l
465
##将netstat命令的执行结果进行处理,使用wc命令统计行数


文档更新时间: 2022-01-29 09:38   作者:xiubao yan