标准I/O和管道

程序包含指令和数据,经常需要读入数据和输出数据

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

用nano打开一个文件,查看其PID 

wKioL1ei033zWPLWAABcWvSDE2w865.jpg-wh_50

0,1,2就是所谓的文件描述符。

在Linux里输入输出和错误都由这三个描述符来表示

标准输入(STDIN) -0 默认接受来自键盘的输入

标准输出(STDOUT)-1 默认输出到终端窗口

标准错误(STDERR)-2 默认输出到终端窗口

我们可以把本来默认显示到终端窗口的输出内容输出到自己指定的终端或文件中,这就是标准输出的重定向 

wKiom1ei04vB-WGJAAAnPQLAbnc397.jpg-wh_50

如果目标文件存在会覆盖目标文件的内容,如果目标文件不存在,自动创建。如果我们想要保留原有文件内容,可以是用“>>”把重定向的内容追加到指定的文件中

wKioL1ei06PiP6rVAABC4KJcosA696.jpg-wh_50

有时候不小心输入错误的命令,会在终端设备上输出错误信息,这时如果我们用“>”符号,发现输出的错误信息并没有重定向到指定的文件中,如果我们想要把输出的错误信息重定向,那么可以使用“2>”符号,这就叫做标准错误的重定向。与标准输出重定向类似,这种输出也会覆盖源文件,如果想要把输出的内容追加到指定文件中,需要使用“2>>”符号

wKioL1ei062jG3WfAAAVLUlxWLI759.jpg-wh_50

为了防止误操作导致有用的文件被覆盖,我们可以使用set -C,禁止将内容覆盖已有文件,但可追加强制覆盖:“>|”,set +C: 允许覆盖。只针对当前终端有效。

如果一条命令有一部分是正确的有一部分是错误的,无论正确的输出结果还是错误的输出结果,都想要重定向到新的文件中,那么我们需要使用“&>”或“>”和“2>&1”配合使用,如果想要追加,只需要把“>”改成“>>”即可。

wKioL1ei08qBzaGTAAAgonQ-D0c310.jpg-wh_50

wKiom1ei1JCB5s1JAAAdTTDMYhw058.jpg-wh_50


不同的结果可以分别重定向到不同的文件中


wKioL1ei1M3C14ahAAAu-KI0Cmc968.jpg-wh_50


也可以同时把两条命令的标准输出重定向到一个文件中,

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


wKiom1ei1AaiMreoAAAwdRSEkJ4196.jpg-wh_50


通过重定向,可以实现把不同文件中的内容合并到同一个文件中


wKioL1ei2HjCl_KmAABhplWChAg943.jpg-wh_50


标准输入的重定向

有些命令需要输入数据,一般需要我们手工通过键盘输入数据,但也可以通过标准输入的重定向把文件中的数据输入到计算机中


wKiom1ei3Uax7NkLAAAVn6H_ozU894.jpg-wh_50


利用标准输入的重定向发送邮件

首先把邮件内容写入到一个文件中


wKioL1ei6kGRUAC9AAClFHaCBGE423.jpg-wh_50

多行重定向

标准I/O和管道

tr命令——转换或删除字符

tr – 转换和删除字符

tr [OPTION]… SET1 [SET2] 

选项:-c或——complerment:取字符集的补集 

    -d或——delete:删除所有属于第一字符集的字符

    -s或—squeeze-repeats:把连续重复的字符以单独一个字符表示

    -t或–truncate-set1:将第一个字符集对应字符转化为第二字符集对应的字符

使用<来重定向标准输入

某些命令能够接受从文件中导入的STDIN: $ tr ‘a-z’ ‘A-Z’< /etc/issue 

该命令会把/etc/issue中的小写字符都转换成写写字符并输出

tr –d abc < /etc/fstab 删除fstab文件中的所有abc中任意字符 


管道(使用符号“|”表示)用来连接命令

命令1 | 命令2 | 命令3 | … 

将命令1的STDOUT发送给命令2的STDIN,命令2的STDOUT发送到命令3的STDIN

STDERR默认不能通过管道转发,可利用“2>&1”或“|&” 实现

最后一个命令会在当前shell进程的子shell进程中执行

用来组合多种工具的功能 ls  | tr 'a-z' 'A-Z'



$命令1 | tee 文件名 | 命令2 

把命令1的STDOUT保存在文件名中,然后管道输入给命令2使用: 

保存不同阶段的输出

复杂管道的故障排除 

同时查看和记录输出


















原创文章,作者:M20-16刘国新,如若转载,请注明出处:http://www.178linux.com/28338