• 【linux】linux的数据流重定向


      首先说一下什么是数据流重定向,所谓数据流重定向简单来说就是一个过程,这个过程捕捉一个文件,或者命令,程序,脚本,甚至脚本中的代码块(code block)的输出,然后把捕捉到的输出,作为输入发送给另外一个文件,命令,程序,或者脚本。

      谈到数据流重定向,我们首先需要了解文件描述符的概念。对于linux内核而言,所有打开的文件都通过文件描述符引用。文件描述符是一个非负整数。当打开一个现有文件或创建一个新文件时,内核向进程等返回一个文件描述符。按照惯例,unix系统shell把文件描述符0与进程的标准输入关联,文件描述符1与标准输出关联,文件描述符2与标准错误关联。总结如下:

      标准输入:文件描述符0,通常指键盘的输入 。使用符号<或<<
      标准输出:文件描述符1,通常指命令执行所回传的正确信息 ,默认输出到屏幕u。使用符号>或>>
      标准错误:文件描述符2,通常指命令执行失败后,所回传的信息,也是默认输出到屏幕。试用符号2>或2>>

      默认情况下>和>>分别表示1>或1>>,<和<<与0<和0<<等价。

    标准输出重定向: 

      #ls

      表示列出当前目录条目,并将结果输出到屏幕。

      #ls 1>file1

      以上命令会把命令的标准输出重新定向到一个文件file,而不是显示到屏幕上,如果不指明文件标识符,系统默认的就是1, 因此1可以省略。

    即这个命令等同于

      #ls >file1

      如果file1不存在,则系统会自动创建。如果已经存在,那么系统首先会把这个文件清空,然后再将数据写入该文件。也就是说>输出到一个已存在的文件,那么会覆盖这个文件。如果不想覆盖,可以使用>>。表示将重定向数据追加到file1文件的末尾。

    标准错误重定向:

      #ls -qw 2>errorfile

      表示将错误信息不输出到屏幕,而是写入errorfile。注意这里的2不能省略。因为>与1>等同,默认是标准输出重定向。所以这里要写成2>,表示标准错误重定向。-qw用来产生错误信息。

    把标准错误和标准输出写入同一个文件:

      #./a.out &>outfile

      这个命令把./a.out的标准输出和标准错误重定向到outfile。&在这里表示标准错误和标准输出。下面是另一种写法:

      #./a.out > outfile  2>&1

      

      下面是一个错误的例子:

      #./a.out > outfile 2>outfile

    标准输入重定向:

      #grep search-world <filename 或 grep search-world 0<filename

      

      还有下面这种方式:

      cat > catfile < ~/.bashrc

      它代表将~/.bashrc的内容作为输入,然后将这些内容写入catfile

    关闭文件:

      "&-"表示关闭文件标识符

      有关关闭文件标识符的操作请参考下面

    n<&- 关闭输入文件标识符n
    0<&-或<&- 关闭标准输入stdin
    n>&- 关闭输出文件标识符n
    1>&-或>&-关闭标准输出stdout

      

    屏蔽标准输出或标准错误:

      ./a.out  > /dev/null      #等同于./a.out 1>dev/null 表示屏蔽标准输出

      ./a.out  2>/dev/null     #表示屏蔽标准错误

      ./a.out > /dev/null 2>/dev/null    #表示同时屏蔽标准输出和标准错误

    打开文件:

    #exec 3<>filename           把文件filename打开,并指定文件标识符为3

      命令j<>filename表示把文件打开,并指明文件标识符为j

    我们什么时候需要重定向:

      1.屏幕输出的信息很重要,而且我们需要将它存下来的时候。

      2. 后台执行中的程序,不希望它干扰屏幕正常的输出结果时。

      3. 一些系统的例行命令。(例如写在/etc/crontab中的文件)的执行结果时,希望它可以存下来。

      4. 一些执行命令的可能已知错误信息时,想以“2>dev/null"将它丢掉

      5. 错误信息与正确信息需要分别输出时

    常用重定向命令:

      cmd > file 把 stdout 重定向到 file 文件中;

      cmd >> file 把 stdout 重定向到 file 文件中(追加);

      cmd 1> fiel 把 stdout 重定向到 file 文件中;

      cmd > file 2>&1 把 stdout 和 stderr 一起重定向到 file 文件中;

      cmd 2> file 把 stderr 重定向到 file 文件中;

      cmd 2>> file 把 stderr 重定向到 file 文件中(追加);

      cmd >> file 2>&1 把 stderr 和 stderr 一起重定向到 file 文件中(追加);

      cmd < file >file2 cmd 命令以 file 文件作为 stdin,以 file2 文件作为 stdout;

      cat <>file 以读写的方式打开 file;

      cmd < file cmd 命令以 file 文件作为 stdin;

      cmd << delimiter Here document,从 stdin 中读入,直至遇到 delimiter 分界符。

      >&n 使用系统调用 dup (2) 复制文件描述符 n 并把结果用作标准输出;

      <&n 标准输入复制自文件描述符 n;

      <&- 关闭标准输入(键盘);

      >&- 关闭标准输出;

      n<&- 表示将 n 号输入关闭;

      n>&- 表示将 n 号输出关闭;

    与重定向相关的题目:

      此题来自《unix环境高级编程》(第3版)P73 3.5

      在Bourne shell、Bourne-again shell 和Korn shell中,digit1>&digit2表示将描述符digit1的重定向至描述符digit2的同一文件。请说明下面两条命令的区别。

      ./a.out > outfile 2>&1

      ./a.out 2>&1 >outfile

      

      答:因为shell从左到右处理命令行,所以:

      ./a.out > outfile 2>&1 等同于./a.out  1>outfile 2>&1

      首先执行 >outfile 设置标准输出到outfile,然后执行2>&1,即调用dup将标准输出复制到描述符2(标准错误上),其结果是将标准输出和标准错误设置为同一个文件,即描述符1和2指向同一个文件表项。而对于命令行

      ./a.out 2>&1 >outfile
      首先执行dup,所以描述符2成为终端(假设命令是交互执行的),标准输出重定向到outfile。结果是描述符1指向outfile的文件表项,描述符2指向终端的文件表项。

    参考资料:

      1.http://os.51cto.com/art/201003/187688.htm

      2.http://blog.csdn.net/ljianhui/article/details/9262737

      3.https://www.ibm.com/developerworks/cn/linux/l-iotips/

      4.《unix环境高级编程》

    命令j<>filename表示把文件打开,并指明文件标识符为j

  • 相关阅读:
    55种网页常用小技巧(javascript) (转)
    如何利用RadioButtonList实现datagrid列的单选 (转)
    实现数据分类汇总的SQL语句 (转)
    在ASP.Net中两种利用CSS实现多界面的方法. (转)
    ASP.NET 中 Session 实现原理浅析 [1] 会话的建立流程
    用户控件中使用客户端脚本的控件名称问题 (转)
    快速理解.NET Framework[翻译] (转)挺不错的翻译
    table的宽度,单元格内换行问题 (转)
    实现类似Windows资源管理器的DataGrid(转)
    vs.net web项目使用visual source safe进行源代码管理(转)
  • 原文地址:https://www.cnblogs.com/vincently/p/4641098.html
Copyright © 2020-2023  润新知