标准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

(0)
上一篇 2016-08-08 20:10
下一篇 2016-08-08 20:10

相关推荐

  • 自制Linux系统

    自制Linux系统 1.首选准备一台Linux虚拟机并添加一块新硬盘 2.分区并创建文件系统,创建两个必要的分区根分区和boot分区 fdisk /dev/sdb  分区 mke2fs -t ext4 /dev/sdb1    创建boot文件系统 mke2f…

    Linux干货 2016-09-16
  • 高考作业

    1、简述TCP三次握手四次挥手过程及各过程中客户端和服务器端的状态。 TCP三路握手,作用为完成三次握手,主机A与主机B开始传送数据。 第一次握手:客户端A(状态为SYN_SEND)发送位码为syn=1,随机产生seq number=1234567的数据包到服务器,服务器B(状态为LISTEN)由SYN=1知道,客户端A要求建立联机; 第二次握手:服务器B(…

    Linux干货 2016-06-22
  • shell脚本编写-3

    1、for循环 for 变量名 in  列表;do 循环体 done 执行机制:依次将列表中元素赋值给“变量名”;每次赋值后即执一次循环体;直到列表中元素耗尽循环结束 列表生成方式: (1) 直接给出列表 (2) 整数列表: (a){start..end} (b) $(seq [start [step]] end)  (3) 返回列表的命…

    Linux干货 2016-08-18
  • CentOS6.8编译安装—- php-fpm

    安装环境: [root@station11 ~]# lsb_release -a Distributor ID: CentOS Description:     CentOS release 6.8 (Final) Release:  6.8 Codename:    …

    Linux干货 2016-12-21
  • shell-在线翻译脚本

            在linux过程中难免会碰到陌生的单词,此时不得不打开翻译软件或网页请求翻译,但这样切换界面比较麻烦,也浪费时间;         今天头脑发热,尝试着在网上找命令行翻译工具,但无果;…

    2017-02-19
  • 文件相关命令

    1、Linux上的文件管理类命令都有哪些,其常用的使用方法及其相关示例演示。 cp:copy 源文件:目标文件 单源复制:cp [OPTION]… [-T] SOURCE DEST 如果DEST不存在,则事先创建此文件,并复制源文件的数据流至DEST中 如果DEST存在: 如果DEST是非目录文件:则覆盖目标文件 如果DEST是目录文件:则先在D…

    Linux干货 2016-09-23