Unix&Linux大学教程:15 标准I/O:重定向和管道

15 标准I/O:重定向和管道

 

15.1 Unix设计准则

        一个程序只做一件事,但必须出色地完成这件事。

        Small is beautiful      Less is more.

 

15.2 Unix新设计准则

        除非程序无法更小,否则小就是完美的。

 

15.3 标准输入、标准输出和标准错误

        To save the output of a program, write standard output to file.

 

15.4 重定向标准输出

        sort > names            将sort的输出写入到names的文件中。

        sort >> names           将sort的输出追加到names的文件的尾部。

 

15.5 放止文件被重定向替换或创建

        set -o(+o) noclobber    置位(复位)  B-Shell

        set(unset) noclobber    置位(复位)  C-Shell

 

        sort >| names           忽略noclobber选项,强行替换文件                B-Shell

        sort >! names           忽略noclobber选项,强行替换文件                C-Shell

 

        在设置了noclobber的情况下,对于:sort >> names,Bourne Shell依然可以追加,而C-Shell和Tcsh则不可以

??1:经试验,我的Ubuntu的C-shell和Tcsh在设置了noclobber选项后,sort>>names依然可以被执行,为什么?

 

15.6 重定向标准输入

        sort < /etc/passwd              对passwd文件进行排序

        sort < /etc/passed > report     从passwd文件读取数据,排序之后,讲述出写入到report文件中。

 

15.7 文件描述符、Bourne Shell家族重定向标准错误

        calculate 8> results            假设一个程序calculate被设计为输出写入到文件描述符为8的文件中,使用此命令运行改程序,能将输出重定向到results文件。

 

        Unix为每个进程提供3个预定义的文件描述符,0代表标准输入,1代表标准输出,2代表标准错误

        command 0< inputfile

        command 1> outputfile

        command 2> errorfile

 

        sort 0< rawdata 1> results 2> errors    此命令于下面的等价,只不过下面的标准错误的“2”不可省略

        sort < rawdata >results 2> errros

 

15.8 子shell

        子shell创建或修改了环境变量,改变并不会影响原始的shell。 

 

        在子shell中运行date命令,可是使用:

                (date)

 

        两种使用子shell的方法:

        1.      

                bash 

                cd ../spreadsheets

                export DATA=statistics

                calculate

               

        2.

               ( cd ../spreadsheets;export DATA=statistics;calculate )          可防止cd命令影响到当前的shell

 

15.9 在C-shell家族中重定向标准错误

        command >& outputfile

 

        使标准错误和标准输出的重定向相互分离:

                (command > outputfile) >& errorfile

                (command >> outputfile) >>& errorfile

 

15.10 组合标准输出和标准错误

        C-Shell:

                sort >& output

                sort >>& output

        B-Shell:

                command x> outputfile y>&x      x,y:文件描述符

        例:

                sort 1> output 2>&1             

                sort > output 2>&1

 

                sort 2>&1 > output      标准输出在被重定向之前发给了shell,当shell处理2>&1时,标准输出仍然发送给显示屏,标准错误最终也被重定向到显示屏。

 

                sort 1>> output 2>&1

                sort 2> output 1>&2

 

        同时重定向标准输出和标准错误(Bash):

                sort >& output

                sout &> output

 

15.11 抛弃输出

        /dev/null文件:位桶(bit bucket),读"slash-dev-slash-null"或"dev-null",发送给它的任何东西都会永远消失。

 

        标准输出重定向到到/dev/null:

                command > /dev/null

 

        希望查看正常输出,但是不希望查看错误消息:

                command 2> /dev/null    (Bash,Korn)

        抛弃所有输出和错误:

                command >& /dev/null            (C-Shell)

                command > /dev/null 2>&1        (Bash,Korn)

        希望抛弃标准错误,不希望抛弃标准输出:

                (command > /dev/tty) >&  /dev/null (C-Shell)a

 

15.12 重定向:小结和体验

        Bourne shell:

        元字符                               动作

        <                               重定向标准输入(同0<)

        >                               重定向标准输出(同1>)

        >|                              重定向标准输出:强制重写

        >>                              追加标准输出(同1>>)

        2>                              重定向标准错误

        2>>                             追加标准错误

        2&>1                            将标准错误重定向到标准输出

        >&或&>                         重定向标准输出+标准错误(只适用于Bash)

        |                               将标准输出通过管道传送给另一条命令

        2>&1|                           将标准输出+标准错误通过管道传送给另一条命令

        如果设置了noclobber选项,则可以使用>|强制重写

 

        C-Shell:

        元字符                               动作

        <                               重定向标准输入

        >                               重定向标准输出

        >!                              重定向标准输出:强制重写

        >&                              重定向标准输出+标准错误

        >&!                             重定向标准输出+标准错误;强制重写

        >>&                             追加向标准输出+标准错误

        >>&!                            追加向标准输出+标准错误;强制文件创建

        |                               将标准输出通过管道传送给另一条命令

        |&                              将标准输出+标准错误通过管道传送给另一条命令

        如果设置了noclobber变量,则可以使用一个!字符强制进行重写或文件创建。

 

15.13 管道线

        管道(pipe):两个程序之间的连接即使管道。

        管道线(pipeline):命令序列本身。

 

        cat file1 file2 file3 > timpfile1       #combine files

        grep Harley < tempfile1 > tempfile2     #extract lines

        wc -l < tempfile2                       #count lines

        rm tempfile1 tempfile2                  #delete temp files

 

        将标准输出和标准错误一起发送给另一个程序:

                command1 2>& | command2         Bourne shell

                command1 |& command2            C-Shell

15.14 管道线分流:tee

        有时候,可能希望将程序的输出同时发送到两个地方。

 

        tee命令语法:

                tee [-a] file ...

                -a(append)

        例;

                cat names1 names2 | tee masterlist | grep Harley        cat的输出保存在masterlist文件中,同时cat的输出传送给grep.

                cat names1 names2 | tee d1 d2 | grep Harley             tee将cat的输出复制到两个文件d1,d2中.

                cat names1 names2 | tee -a backup | grep Harley         cat的输出将追加到backup文件的结尾.

 

        希望查看命令的输出并且同时巴蜀出保存到文件中:     command | tee file

 

        例:

                who | tee status

                hwo | tee status | less

 

15.15 管道的重要性

        “To put my strongest into a nutshell:

        We should havae some ways of connecting programs like a garden hose----screw in another segment when it becomes necessary to massage data in another way...”

                                        Dong McIlroy 1964-10-11

 

15.16 条件执行

        And:    command1 && command2

        Or:     command1 || command2

 

        如果需要终止一个正在运行的管道线,只需按下发送intr信号.

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值