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

      <<用法

      

    [root@localhost ~]# cat > catfile << "eof"
    > tesht 
    > sof
    > eof

    当输入eof时,该次输入就结束且关键字eof不会写入到文件中。

    关闭文件:

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

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

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

    打开文件:

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

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

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

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

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

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

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

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

    常用重定向命令:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

      >&- 关闭标准输出;

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

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

     
  • 相关阅读:
    查询解决问题的方法
    C++实现网格水印之调试笔记(三)—— 初有结果
    C++实现网格水印之调试笔记(二)
    C++实现网格水印之调试笔记(一)
    C++调用matlab实例
    C++调用Matlab引擎及Eigen配置
    A Blind Watermarking for 3-D Dynamic Mesh Model Using Distribution of Temporal Wavelet Coefficients
    Watermarking 3D Polygonal Meshes in the Mesh Spectral Domain
    Apriori学习笔记
    Robust Mesh Watermarking
  • 原文地址:https://www.cnblogs.com/alighie/p/7878968.html
Copyright © 2011-2022 走看看