• Linux下Shell重定向


    1. 标准输入,标准输出与标准错误输出

    Linux下系统打开3个文件,标准输入,标准输出,标准错误输出。

    标准输入:从键盘输入数据,即从键盘读入数据。

    标准输出:把数据输出到终端上。

    标准错误输出:把标准错误输出到终端上。

    默认的标准输入指的是键盘,默认的标准输出与标准错误输出指的是屏幕或者是终端。

    系统为这三个文件分配了文件标识符fd(file descripter).

    在Linux系统下,一切皆是文件,对文件的操作,一般要用到文件标识符。它们的文件标识符,分别为0,1,2.

    2. 重定向

    重定向分为输入重定向与输出重定向。

    所谓的输入重定向即输入不从键盘读入,而是从文件输入或其它。

    所谓的输出重定向即不输出到终端上,而是输出到文件中去或其它。

    ""<"表示输入重定向运算符,">"表示输出重定向运算符。

    "<<"这种输入告诉Shell,当前标准输入来自命令行的一对分隔号的中间内容。

    ">>",用">"输出时,如果文件不存在会自动建立一个文件,如果第二次输入时,会覆盖前一次的输入内容,而">>"表示把第二次的输出内容追加到文件中去,而不是覆盖。

    3. 下面看一下几个例子

    (1)输入重定向

     [root@localhost ~]# wc</etc/inittab
    53 229 1666

    wc统计行数,单词数, 字符数

    其中wc的输入来自 /etc/inittab
    [root@localhost ~]# wc <<aa
    > 1
    > 11
    > 111
    > aa
    3 3 9

    wc统计分隔符aa之间的内容。

    (2)输出重定向

     [root@localhost ~]# ps -ef >a.txt   //把进程的信息输出重定向到a.txt文件中去

     [root@localhost ~]# ps -ef> >a.txt //进程信息追加到a.txt的文件中去

    其实,所谓的输入输出重定向就是不从键盘输入和屏输出。

    4. Linux下输出重定向的典型分析

    (1) a.out > outfile 2>&1
    (2) a.out 2> &1 >outfile

    分析:

    0代表标准输入,1代表标准输出,2代表标准错误输出。其中1(即>=1>)可以省略,默认为标准输出。

    (1)首先把a.out重定向到outfile文件中去。然后把 2>&1把标准错误输出重定向到标准输出中去。此时的标准输出已经重定向了,相当于把标准输出与标准错误输出都一起重定向到outfile 中去。 &1代表的是标准输出的文件描述符。1一般放在左边表示标准输出重定向到什么位置,而1放在右边是重定向到标准输出中,所以用&区分一 下,表示标准输出的文件描述符。2>1表示把标准错误重定向到文件1中去,2>&1则表示标准错误重定向到标准输出中去。

    (2)首先把标准错误输出重定向到标准输出中,此时标准输出还在终端。因此标准错误也在终端。然后标准输出到outfile中去了。而标准错误还是在终端。

    因此,(1)表示标准输出与标准错误都到outfile中去了。

             (2)表示标准输出到outfile,但标准错误输出仍然在终端。

    ls 1>/dev/null 2>/dev/null

    ls >/dev/null  2>&1

    /dev/null是一个垃圾箱,是一个无底洞,表示的含义为不显示。

    即标准输出与标准错误输出不显示。

    以上两个命令表示的含义是相同的。

    4.exec绑定重定向

    格式:

    exec 文件描述符[n] <或> file或文件描述符或设备

    在上面讲的输入,输出重定向 将输入,输出绑定文件或设备后。只对当前那条指令是有效的。如果需要在绑定之后,接下来的所有命令都支持的话。就需要用exec命令

    实例:

    [chengmo@centos5 shell]$ exec6>&1
    #将标准输出与fd 6绑定
    [chengmo@centos5 shell]$ ls/proc/self/fd/
    0  1  2  3  6
    #出现文件描述符6
    [chengmo@centos5 shell]$ exec1>suc.txt
    #将接下来所有命令标准输出,绑定到suc.txt文件(输出到该文件)
    [chengmo@centos5 shell]$ ls-al
    #执行命令,发现什么都不返回了,因为标准输出已经输出到suc.txt文件了
    [chengmo@centos5 shell]$ exec1>&6
    #恢复标准输出
    [chengmo@centos5 shell]$ exec6>&-
    #关闭fd 6描述符
    [chengmo@centos5 ~]$ ls/proc/self/fd/
    0  1  2  3

    说明:使用前先将标准输入保存到文件描述符6,这里说明下,文件描述符默认会打开0,1,2 还可以使用自定义描述符 。然后对标准输出绑定到文件,接下来所有输出都会发生到文件。 使用完后,恢复标准的输出,关闭打开文件描述符6。

    有趣事情:

    可能有朋友会这样用:exec 1>suc.txt ,接下来所有输出都绑定到suc.txt 文件,那么怎么样恢复原来的呢? 试试你就会发现问题所在……

    参考资料:

    http://blog.csdn.net/jfkidear/article/details/7823486

    http://www.cnblogs.com/chengmo/archive/2010/10/20/1855805.html

    http://www.360doc.com/content/13/0523/16/7044580_287544243.shtml

  • 相关阅读:
    Spring_Bean的配置方式
    Nginx Ingress设置账号密码
    2.2.4 加减运算与溢出
    2.2.5-2 补码乘法
    2.2.3 移位运算
    flask钩子函数
    flask的cookie、session
    循环冗余校验码
    海明校验码
    python中的 __call__()
  • 原文地址:https://www.cnblogs.com/wangyongbin/p/4432232.html
Copyright © 2020-2023  润新知