bash的I/O重定向及管道
一、概述
在shell中,最常使用的fd(file descriptor)有三个,标准输入,标准输出,错误输出。进程用文件描述符来管理打开的文件。
|----------------|-------|-------------------------------|
| 名称 | 文件描述符 | |
| 标准输入(stdin) | 0 | 键盘,也可以是其他文件或者命令的输出的内容可以作为标准输入 |
| 标准输出(stdout) | 1 | 默认输出到屏幕 |
| 错误输出(stderr) | 2 | 默认输出到屏幕 |
| 文件名称(filename) | 3+ | |
二、I/O重定向:改变标准位置
标准的输入设备默认指的是键盘,标准的输出设备默认指的是显示器。
-
-
- 输入重定向:指定设备(通常是文件或命令的执行结果)来代替键盘作为新的输入设备;
- 输出重定向:将原本要输出在屏幕上的结果放到指定的设备(通常是文件)
-
< 标准输入重定向
> 标准输出重定向
2> 标准错误输出重定向
&> 把所有输出(标准输出、标准错误输出)重定向
三、输出重定向:
COMMAND > NEW_POS,COMMAND >> NEW_POS
>:覆盖重定向,原内容清空
>>:追加重定向
注: set -C :禁止将内容重定向到已有文件中
强制覆盖:>|
set +C:取消set -C命令的作用
标准输出和错误输出流分别输出到不同的文件中:
COMMAND >> FILENAME1.out 2>>FILENAME2.out
合并标准输出流和错误输出流到同一个文件中:
COMMAND &>> FILENAME.out
效果同上:COMMAND >>FILENAME.out 2>>&1(注意顺序)
四、输入重定向
命令 < 文件 将指定文件作为命令的输入设备
命令 << 分界符 表示从标准输入设备(键盘)中读入,直到遇到分界符才停止(读入的数据不包括分界符)
命令 < 文件1 > 文件2 将文件1作为命令的输入设备,该命令的执行结果输出到文件2 中。
案例1:
tr命令:转换或删除字符
tr [OPTION]... SET1 [SET2]
tr abc ABC < /etc/fstab
案例2:cat是为了将标准输入的内容标准输出,这里将标准输出又重定向到1.log文件。
多行重定向输出可以使用上述方式,单行重定向可以使用:echo 'abc' > 1.log
五、管道
COMMAND1 | COMMAND2 | COMMAND3 | ...
将命令1的STDOUT发送给命令2的STDIN,命令2的STDOUT发送到命令3的STDIN
STDERR错误重定向不能通过管道转发,可利用2>&1转化后实现
note:最后一个命令会在当前shell进程的子shell进程中执行。
六、tee命令
tee命令:重定向到多个目标
格式:命令1 | tee [-a ] 文件名 | 命令2
把命令1的Stdout先保存在文件中,同时Stdout做为命令2的输入
例: