zoukankan      html  css  js  c++  java
  • shell学习三十三天----关于重定向

    关于重定向

    额外的重定向运算符

    使用set -C搭配

    POSIX shell提供了防止文件意外截断的选项:运行set -C命令可打开shell所谓的禁止覆盖选项,当它再打开状态时,单纯的>重定向遇到目标文件已存在时,就会失败.>|运算符则能够另noclobber选项失效.

    提供行内输入的<<<<-:使用program<<得力miter,能够在shell脚本正文内提供输入数据;这样数据叫嵌入文件.在默认情况下,shell能够在嵌入文件正文内做变量.命令和算数替换.

    #!/bin/bash

    cd /home

    du -s * |

            sort -nr |

                    sed 10q |

                            while read amount name

                            do

                                    mail -s "disk usage waring " $name<<EOF

                                    Greetings You are one of the  top of 10 consumers of disk ...

                                Please clean up unneeded files ,as soon as possible

                                Thanks .

                                EOF

                            done

    分析:当中邮件内容就是输入数据.

    假设界定符以不论什么一种形式的引號括起来,shell便不会处理输入的内文,案例:

    [root@localhost tmp]# i=5

    [root@localhost tmp]# cat <<'E'OF

    > this is the calue if i : $i

    > here is a command sub :$(echo hello,world)

    > EOF

    this is the calue if i : $i

    here is a command sub :$(echo hello,world)

    界定符没有不论什么引號隔开

    cat <<EOF

    > this is the calue if i : $i

    > here is a command sub :$(echo hello,world)

    > EOF

    this is the calue if i : 5

    here is a command sub :hello,world

    嵌入文件重定向器的另外一种形式有一个负号结尾.这样的情况下,全部开头的制表符(Tab)在传递给程序作为输入之前,都从嵌入文件与结束定界符中删除(注意:仅仅有开头的制表符会被删除,开头的空格不会删除).这么做,shell脚本更易于阅读了.

    <>打开一个文件作为输入输出仅仅用

    使用program<>file,可供读取与写入操作.默认是在标准输入上打开file.一般来说,<以仅仅读模式打开文件,>以仅仅读模式打开.<>运算符则是以读取与写入两种模式打开给定的文件.这交由program确定并充分利用;实际上,使用这个操作符并不须要太多的支持.

    文件描写叙述符处理

    linux用文件描写叙述符来标示每个文件对象.文件描写叙述符是一个非负整数,能够唯一的标示回话中打开的文件.

    bash保留了3个文件描写叙述符

    文件描写叙述符

    缩写

    描写叙述

    0

    STDIN

    标准输入

    1

    STDOUT

    标准输出

    2

    STDERR

    标准错误

    STDIN文件描写叙述符代表shell的标准输入,对于终端来说,白鸟准输入就是键盘.

    在使用输入重定向符号(<),linux会用重定向指定的文件来替换标准输入文件描写叙述符.

    STDOUT文件描写叙述符代表标准的shell输出.在终端上,标准输出就是显示器.

    使用输出重定向符号(>,>>),能够将要输出到显示上的内容从定向到指定的文件里.

    STDERR文件描写叙述符用来处理错误消息,它代表shell的标准错误输出.

    默认情况下STDOUTSTDERR指向相同的地方,默认情况下,错误消息也会输出到显示器输出.

    重定向错误输出

    仅仅重定向错误,例如以下:在上面的表中看到STDERR文件描写叙述符被设置成2

    [root@localhost tmp]# ls t 2>error

    [root@localhost tmp]# cat error 

    ls: 无法訪问t: 没有那个文件或文件夹

    重定向错误和数据:

    [root@localhost tmp]# mkdir task

    [root@localhost tmp]# cd task/

    [root@localhost task]# mkdir task

    [root@localhost task]# ls task t 2>error 1>list

    [root@localhost task]# cat list

    task:

    [root@localhost task]# cat error 

    ls: 无法訪问t: 没有那个文件或文件夹

    分析:假设出现错误,就将错误信息放入error;假设正确,就将输出信息放到list.

    也能够将STDOUTSTDERR输出到同一个文件:

    [root@localhost tmp]# mkdir task

    [root@localhost tmp]# ls task t&>out

    [root@localhost tmp]# cat out       

    ls: 无法訪问t: 没有那个文件或文件夹

    task:

    在脚本中重定向输出有两种方式:

    1.暂时重定向每行输出

    2.永久重定向脚本中的全部命令

    先看第一种----暂时重定向

    如要有益在脚本中生成错误消息,须要将单独的一行(echo &”error msg>” &2)输出重定向到STDERR.

    案例:

    #!/bin/bash

    echo "error msg" >&2

    echo "normal msg"

    运行脚本,输出结果:

    error msg

    normal msg

    分析:在重定向文件描写叙述符时,你必须在文件描写叙述符数字和输出重定向符号之间加上一个&符号.

    默认情况下,linux会将STDERR定向到STDOUT.可是,假设在执行脚本时重定向了STDERR,脚本中全部定向到STDERR的文本都会被重定向,案例:

    [root@localhost tmp]# ./test.sh 2>test

    normal msg

    [root@localhost tmp]# cat test

    error msg

    分析:把运行脚本的标准错误输出重定向到test,而在上一步中,”error msg”定向到了标准错误输出.

    另外一种----永久重定向

    假设在脚本中有大量数据须要重定向,能够使用exec命令告诉shell在脚本运行期间重定向到某个特定文件描写叙述符:

    bash代码:

    #!/bin/bash

    exec 1>testout

    echo "error msg2"

    echo "normal msg2"

    echo "error msg1"

    echo "normal msg1"

    运行:

    [root@localhost tmp]# ./test1.sh  

    [root@localhost tmp]# cat testout 

    error msg2

    normal msg2

    error msg1

    normal msg1

    在脚本中重定向输入:

    使用exec命令将STDIN重定向到linux系统上的文件里:
    exec 0< testfile

    这个命令告诉shell从文件testfile中获得输入,而不是STDIN.

    扩展exec命令:

    语法:exec [ program [arguments...] ]

    用途:

    以新的程序代替shell,或改变shell本身的I/O设置.

    主要选项:

    行为:

    搭配參数----也就是使用指定的程序代替shell,以传递參数给它.假设仅仅是用I/O重定向,则会改变shell本身的文件描写叙述符.

    详细的參考:

    http://www.cnblogs.com/peida/archive/2012/11/14/2769248.html

  • 相关阅读:
    struts1——静态ActionForm与动态ActionForm
    【入门篇】ANDROID开发之BUG专讲
    oracle undo 复杂度--oracle核心技术读书笔记四
    linux高级技巧:rsync同步(二)
    【c语言】数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字
    一维动态数组和二维动态数组的创建和使用
    HDU 1788 Chinese remainder theorem again 中国剩余定理
    直接选择排序
    使用enca进行字符集转码
    拒绝switch,程序加速之函数指针数组
  • 原文地址:https://www.cnblogs.com/wgwyanfs/p/6815672.html
Copyright © 2011-2022 走看看