zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Codeforces 1255B Fridge Lockers
    Codeforces 1255A Changing Volume
    Codeforces 1255A Changing Volume
    leetcode 112. 路径总和
    leetcode 129. 求根到叶子节点数字之和
    leetcode 404. 左叶子之和
    leetcode 104. 二叉树的最大深度
    leetcode 235. 二叉搜索树的最近公共祖先
    450. Delete Node in a BST
    树的c++实现--建立一棵树
  • 原文地址:https://www.cnblogs.com/wangyongbin/p/4432232.html
Copyright © 2011-2022 走看看