三、标准I/O重定向和管道
内容概述
- 三种I/O设备
- 把I/O重定向至文件
- 使用管道
1 标准输入和输出
程序:指令+数据
打开的文件都有一个fd: file descriptor (文件描述符)
Linux给程序提供三种 I/O 设备
- 标准输入(STDIN) -0 默认接受来自终端窗口的输入
- 标准输出(STDOUT)-1 默认输出到终端窗口
- 标准错误(STDERR) -2 默认输出到终端窗口
I/O重定向:将默认的输入,输出或错误对应的设备改变,指向新的目标
2.1标准输出和错误重新定向
STDOUT和STDERR可以被重定向到指定文件,而非默认的当前终端
格式: 命令 操作符号 文件名
支持的操作符号包括:
&> 把所有输出重定向到文件
以上如果文件已存在,文件内容会被覆盖
追加
>> 可以在原有内容基础上,追加内容
把输出和错误重新定向追加到文件
- >> 追加标准输出重定向至文件
- 2>> 追加标准错误重定向至文件
标准输出和错误输出各自重定向到不同位置
&> 覆盖重定向
&>> 追加重定向
COMMAND > /path/to/file.out 2>&1 (顺序很重要)
COMMAND >> /path/to/file.out 2>&1
( cal 2007 ; cal 2008 ) > all.txt

tr命令
tr [OPTION]... SET1 [SET2] 选项:
- -d --delete:删除所有属于第一字符集的字符
- -s --squeeze-repeats:把连续重复的字符以单独一个字符表示
- -t --truncate-set1:将第一个字符集对应字符转化为第二字符集对应的字符
使用“<<终止词”命令从键盘把多行重导向给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的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的STDOUT保存在文件中,做为命令2的输入 选项:
-a 追加
功能:
- 保存不同阶段的输出
- 复杂管道的故障排除
- 同时查看和记录输出
重定向中的 - 符号
重定向有时会使用 - 符号
范例:
将 /home 里面的文件打包,但打包的数据不是记录到文件,而是传送到 stdout,经过管道后,将 tar - cvf - /home 传送给后面的 tar -xvf - , 后面的这个 - 则是取前一个命令的 stdout, 因此,就不需要使用 临时file了
tar -cvf - /home | tar -xvf -

浙公网安备 33010602011771号