重定向和管道
目标
通过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
2022年 01月 29日 星期六 09:16:17 CST
##标准输出重定向到time文件
[root@jenkins ~]# echo $(date) >> time
[root@jenkins ~]# cat time
2022年 01月 29日 星期六 09:16:17 CST
2022年 01月 29日 星期六 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
2022年 01月 29日 星期六 09:22:45 CST
ls: 无法访问/sdf: 没有那个文件或目录
##将标准输出和标准错误输出重定向到time文件
[root@jenkins ~]# (date ; ls /sdf) &>time
[root@jenkins ~]# cat time
2022年 01月 29日 星期六 09:24:28 CST
ls: 无法访问/sdf: 没有那个文件或目录
##将标准输出和标准错误输出重定向到time文件,可以只使用&字符
[root@jenkins ~]# netstat -anput | wc -l
465
##将netstat命令的执行结果进行处理,使用wc命令统计行数