三、标准I/O重定向和管道

标准I/O重定向和管道

 

内容概述

  • 三种I/O设备
  • 把I/O重定向至文件
  • 使用管道

1 标准输入和输出

程序:指令+数据

读入数据:Input
输出数据:Output

打开的文件都有一个fd: file descriptor (文件描述符)

Linux给程序提供三种 I/O 设备

  • 标准输入(STDIN) -0 默认接受来自终端窗口的输入
  • 标准输出(STDOUT)-1 默认输出到终端窗口
  • 标准错误(STDERR) -2 默认输出到终端窗口
2 I/O重定向redirect

 I/O重定向:将默认的输入,输出或错误对应的设备改变,指向新的目标

2.1标准输出和错误重新定向

STDOUT和STDERR可以被重定向到指定文件,而非默认的当前终端

格式:   命令 操作符号 文件名 

支持的操作符号包括: 

1> 或 >         把STDOUT重定向到文件
2>               把STDERR重定向到文件
&>               把所有输出重定向到文件

 以上如果文件已存在,文件内容会被覆盖

追加

>> 可以在原有内容基础上,追加内容

把输出和错误重新定向追加到文件 

  • >> 追加标准输出重定向至文件
  • 2>> 追加标准错误重定向至文件

标准输出和错误输出各自重定向到不同位置

COMMAND > /path/to/file.out 2> /path/to/error.out
合并标准输出和错误输出为同一个数据流进行重定向

&> 覆盖重定向

&>> 追加重定向

COMMAND > /path/to/file.out 2>&1 (顺序很重要)

COMMAND >> /path/to/file.out 2>&1 

():合并多个程序的STDOUT
( cal 2007 ; cal 2008 ) > all.txt

tr命令

tr 转换和删除字符
tr [OPTION]... SET1 [SET2]  选项:
  • -d --delete:删除所有属于第一字符集的字符
  • -s --squeeze-repeats:把连续重复的字符以单独一个字符表示
  • -t --truncate-set1:将第一个字符集对应字符转化为第二字符集对应的字符
把多行发送给STDIN

  使用“<<终止词”命令从键盘把多行重导向给STDIN,终止词通常使用EOF

 直到 终止词 位置的所有文本都发送给STDIN
 有时被称为就地文本(heretext)
mail -s "Please Call" admin@magedu.com <<END > Hi Wang,

>
> Please give me a call when you get in. We may need > to do some maintenance on server1.
>
> Details when you're on-site
> Zhang
> END

管道
管道(使用符号“|”表示)用来连接命令
命令1 | 命令2 | 命令3 | ...
  • 将命令1的STDOUT发送给命令2的STDIN,命令2的STDOUT发送到命令3的 STDIN
  • STDERR默认不能通过管道转发,可利用2>&1 或 |& 实现 
  • 最后一个命令会在当前shell进程的子shell进程中执行用来 
  • 组合多种工具的功能 ls | tr ‘a-z’ ‘A-Z’

less :一页一页地查看输入 ls -l /etc | less 

tee命令

tee 命令
利用 tee 命令可以重定向到多个目标,经常配合管道符一起使用

格式:

命令1 | tee [-a ] 文件名 | 命令2

以上可以把命令1的STDOUT保存在文件中,做为命令2的输入 选项:

-a  追加

功能:

  • 保存不同阶段的输出
  • 复杂管道的故障排除
  • 同时查看和记录输出

重定向中的 - 符号

重定向有时会使用 - 符号

范例:

将 /home 里面的文件打包,但打包的数据不是记录到文件,而是传送到 stdout,经过管道后,将 tar - cvf - /home 传送给后面的 tar -xvf - , 后面的这个 - 则是取前一个命令的 stdout, 因此,就不需要使用 临时file了

tar -cvf -  /home  |  tar -xvf  -

 

 

 


 

 

   

 

 

posted @ 2022-02-06 14:33  luca-sHi  阅读(65)  评论(0)    收藏  举报