Linux I/O重定向和管道
标准输入和输出
-
程序:指令+数据
-
读入数据
-
读出数据
-
打开的文件都有一个fd: file descriptor (文件描述符)
Linux给程序提供三种 I/O 设备
- 标准输入(STDIN) -0 默认接受来自终端窗口的输入
- 标准输出(STDOUT)-1 默认输出到终端窗口
- 标准错误(STDERR) -2 默认输出到终端窗口
[[root@Centos ~]#ll /dev/std*
lrwxrwxrwx. 1 root root 15 Apr 14 13:42 /dev/stderr -> /proc/self/fd/2
lrwxrwxrwx. 1 root root 15 Apr 14 13:42 /dev/stdin -> /proc/self/fd/0
lrwxrwxrwx. 1 root root 15 Apr 14 13:42 /dev/stdout -> /proc/self/fd/1
IO重定向(redirect)
- 将默认的输入,输出或错误对应的设备改变,指向新的目标
标准输出和错误重新定向
- STDOUT和STDERR可以被重定向到指定文件,而非默认的当前终端
格式
命令 操作符号 文件名
支持的操作符号
1> 或 > 把STDOUT重新定向到文件
2> 把STDERR重新定向到文件
&> 或 >& 把STDOUT和STDERR都重新定
如果以上文件已经存在,文件内容会被覆盖
set -C 禁止将内容覆盖已有文件,但可追加, 利用 >| 仍可强制覆盖
set +C 允许覆盖,默认
追加
- 可以使用>>在原有内容基础上,追加内容,把输出和错误重新定向到追加的文件中
>> 追加标准输出重定向至文件
2>> 追加标准错误重定向至文件
把标准输出和标准错误重定向
COMMAND > /path/to/file.out 2> /path/to/error.out
tr命令
- tr转换和删除字符
tr [选项] [参数]
-d 删除所有属于第一字符集的字符
-s 去重
-t 将第一个字符集对于的字符转化为第二个字符集对应的字符
-c 取代所有不属于第一字符集的字符
范例
# 将/data/abc中的小写字符转化成大写字符
tr 'a-z' 'A-Z'< /data/abc
标准输入重定向
- 实现标准输入重定向的符号
COMMAND 0< FILE
COMMAND < FILE
[root@centos /]#cat > /data/a.txt
hello
输入完之后按Ctrl+D离开
可以使用文件来代替键盘的输出
[root@centos /]#cat < /data/a.txt> /data/b.txt
[root@centos /]#cat /data/b.txt
hello
管道
- 使用 |(管道)用来连接多个命令
格式
命令1 | 命令2 | 命令3
功能说明
- 将命令1的输出传递给命令2,命令2的输出传递给命令3
- 所有命令会在当前shell进程中的子进程中执行
注意:STDERR输出错误默认不能通过管道转发,可利用2>&1或 |&实现
命令1 2>&1 | 命令2
命令1 |& 命令2
tee命令
- 利用tee命令可以重定向到多个目标,经常配合管道符一切使用
# 把命令1的STDOUT保存在文本中,作为命令2的输入
命令1 | tee [-a] 文件名 | 命令2
# [-a]是追加命令
功能
- 保存不同阶段的输出
- 复杂管道故障排除
- 同时查看和记录输出
范例
# 计算1+..+100
[root@centos8 ~]#echo {1..100}|tr ' ' +| bc
5050
[root@centos8 ~]#seq -s + 1 100 |bc
5050

浙公网安备 33010602011771号