码迷,mamicode.com
首页 > 其他好文 > 详细

重定向与管道

时间:2016-08-02 17:13:05      阅读:180      评论:0      收藏:0      [点我收藏+]

标签:linux   管道   定向   程序   file   

一、解读重定向

  程序必须能够读入输入然后经过加工来显示结果,程序获取的数据也多种多样,程序生产出来的结果也是多种多样的。也就是说程序要有读入也要有输出。

技术分享

    读入数据:Input

    输出数据:Output

  在linux中一切接文件。这就意味着,任何设备在系统中都有一个与之对应的文件。所以我们就可以通过文件来访问设备。对于用户来说,访问文件就是通过文件名来进行的,用户看到的是文件名,但是,对于内核来说,所有都是数字,这个数字就是文件描述符来访问文件。打开现存文件或新的文件时,内核返回一个fd。读写文件都需要使用fd来制定读写的文件。fd:file descriptor(文件描述符)

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

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

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

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

    I/O重定向:改变默认位置

技术分享

  当执行重定向时我们看到 ls显示的结果被输出到一个新的文件中,如果testdir中没有该文件,那么将自动创建该文件。

技术分享

  而我又将ll结果重定向到文件中,那么我们会发现,之前的结果没有了,都被覆盖了,所以文件的创建方法是。

1:该文件若不存在,系统会自动建立该文件。

2:当这个文件存在,系统会将这个文件的内容清空,让后将数据写入。

3:如果以>输出到一个已存在的文件,文件会被覆盖。

  如果我们不想覆盖该文件使用>>(累加)就可以了

二、重定向具体用法

  STDOUT和TDERR可以被重定向到文件:

    命令  操作符号  文件名

   支持的操作符号有:

    > 把STDOUT重定向到文件

    2> 把STDERR重定向到文件

    &> 把所有输出重定向到文件

   >文件内容会被覆盖

    #set -C:禁止将内容覆盖已有文件,但可追加强制覆盖:>|

    #set+C:允许覆盖

   >>  原有内容基础上,追加内容

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

    2>:覆盖重定向错误输出数据流;

    2>>:追加重定向错误输出数据流;

    标准输出和错误输出各自定向至不同位置:

    COMMAND > /path/to/file.out > /path/to/error.out

    合并标准输出和错误输出为同一个数据流进行重定向

        &>:覆盖重定向

        &>>:追加重定向

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

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

    find /etc -name passwd  2> /dev/null

  /dev/null垃圾桶黑洞的用法

    如果我们知道会出现大量的错误信息而又不想让它显示出来,这个时候使用黑洞设备/dev/null。它可以吃掉导向它的所有信息

    ():合并多个程序的STDOUT

      (cal 2007;cal2008)>all.txt

    standard input:<与<<

   <就是讲原本需要由键盘输入的数据改由文件内容来替代。如下图所示。

技术分享

   <很有帮助,尤其是在发邮件mail这种命令中。那么<<又是什么意思呢,它代表结束输入的意思。如下图

技术分享

可以看出end就是结束输入,他并没有显示在文件中。

    使用<来重定向标准输入

    某些命令能够接受从文件中导入的STDIN:

        $tr ‘a-z‘  ‘A-Z‘< /etc/issue

    将文件中的小写字母转换为大写字母。

        tr -d abc</etc/issue

    删除issue文件中所有abc中任意字母。

        #cat > filea  

    按ctrl+d离开,可以使用文件来代替键盘的输入

        #Cat > filea < fileb




   tr-转换和删除字符

    tr[OPTION]...SET1[SET2]

    选项:

        -c或--complerment:取字符集的补集

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

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

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

   管道

技术分享

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

        命令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

    mail: 通过电子邮件发送输入:

        $ echo "test email" | mail \ -s "test" user@example.com

重定向与管道

标签:linux   管道   定向   程序   file   

原文地址:http://10957042.blog.51cto.com/10947042/1833556

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!