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 
posted @ 2022-04-16 22:36  Eiji-Lee  阅读(56)  评论(0)    收藏  举报