一、什么是数据流重定向
在说数据流重定向之前,先来说说数据流的概念吧。数据流分为三种:标准输入(stdin),标准输出(stdout)和标准错误输出(stderr)。

简单来说,标准输出指的是命令执行所回传的正确信息,而标准错误输出指的是命令执行失败后,所回传的错误信息。这些信息默认是打印在屏幕上的。

那么什么时数据流重定向呢?从字面上理解就是改变数据流的流向,使之流向指定的文件或设备。例如,把执行命令所回传的正确信息(标准输出信息)流向一个文件,而将所回传的错误信息(标准错误输出)流向别一个文件,并把这两个文件的信息保存下来,而在屏幕上不出现任何该命令执行所回传的信息。

二、数据流重定向的实现

1、数据流重写向的分类
在Linux中利用shell实现数据流重定向是非常简单的,下面来介绍3种数据流的重定向。

1)标准输入(stdin):代码为0,使用<或者<<
2)标准输出(stdout):代码为1,使用>或者>>
3)标准错误输出(stderr):代码为2,使用2>或者2>>


看到这里,你可能还是很疑惑,那个代码有什么作用,<和<<有什么不同,>和>>又有什么不同?

2、代码的作用

那个代码是为了区分命令中所使用的不同的数据流而设定的,例如,0代码的就是标准输入。注意在默认情况下,>和>>分别表示1>和1>>,
而<和<<分别表示0<和0<<。

3、标准输出数据流重定向详解

在说输入之前,我先跟大家说说输出吧,一般使用例子都能让人更容易明白一样东西是怎么样使用的。所以请看下面的例子,在当前目录下,已存在一个名为StreamTest.txt的文本件,我使用cat命令来进行测试,我们知道,cat命令会把文本文件中的内容输出到屏幕上来。请看下面的例子:


我们可以看到直接使用cat命令,StreamTest.txt文件的内容直接打印在屏幕上。

而第二条语句cat StreamTest.txt > outfile1使用了数据流重定向,那么这条语句是什么意思呢?它的意思就是把由cat命令所产生的直接输出到屏幕上的信息输出到文件outfile1中,并保存。而且你可以看到,原本应在屏幕上输出的信息并没有输出到屏幕上,因为它输出到了文件outfile1中。这样你就应该能理解为什么叫数据流重定向了吧。

值得
注意的是,如果outfile1文件不存在于当前目录下,系统则会自动创建这个文件;如果这个文件已经存在于当前目录下,那么系统就会先把这个文件中的内容清空,然后再将数据写入到该文件,也就是说若以>输出到一个已存在的文件,则这个文件的内容将会被覆盖。

那有没有什么方法能不让文件内容被覆盖呢?当然就,那就是>>,这也就是>与>>的区别。其用法与>大同小异,如下图:


同样的,使用这个命令,如果outfile2不存在于当前目录中,则系统会自动创建这个文件,而如果这个文件已经存在于当前目标下,则会把数据追加到该文件的末尾。所以在图中看到了两份重复的内容。

注:因为在默认情况下,>和>>分别表示1>和1>>,所以在命令中没有用到1>和1>>,因为它们是等价的。

4、标准错误输出数据流重定向详解
标准错误输出的使用和标准输出的使用大同小异,在这里不再赘述,其使用如下:



由于当前目标下不存在文件TestStream.txt,所以直接使用cat,则会在屏幕上输出错误提示,当然我们也可以用数据流重定向2>来把它输出到文件errfile中,而不是输出到屏幕上。因为>默认是代码1,所以这里需要写成2>,系统才知道这个是标准错误输入重定向,那现在你应该更深刻地理解到代码的作用了吧。而2>>也是追加的作用。

通过上面的例子可以看到,我们可以利用数据流重定向把错误信息和正确信息分开。

5、标准输入数据流重写向详解详解
在标准输入中,<代表将原来需要由键盘输入的数据改由文件内容来替代,<<则代表结束输入。例如:
利用cat来创建一个简单的文件catfile1,如下图所示:



如果当前目录下不存在catfile1,则系统自动创建这个文件,并由键盘向这个文件写入内容;若文件已存在,则用输入的内容覆盖该文件中的内容。而标准输入重定向可以用文件的内容来替代键盘输入,其操作如下图所示:


可以看到,它把catfile1的内容输入到catfile2中,代替先前的键盘输入。

值得
注意的是,在标准输入重定向中<<并不表示追加,而是表示结束输入的意思,即作为一个结束符。请看如下的例子:


之前的例子,都是使用ctrl+D来结束的,而这个例子,当你输入“eof”时,自动退出了,当然这个结束符,你可以自己定义。这对写程序是有一定的好处的。

三、把正确信息与错误信息写入同一个文件中的方法
上面的例子,都是把正确和错误的信息分别存储在不同的文件上的,那有没有办法把正确和错误的信息都储存在同一个文件中呢?当然有!请看下面的例子:



注意:上面第三行的命令是错误的,虽然它看看起来非常直观。它的错误并不是因为语法之类的错误,也不是因为它不能执行,而是因为,有两条数据流同时写入一个文件,又没有特殊的语法,此时会导致两条数据流交叉地写入文件,造成次序的错乱,而不是屏幕上原来输出的排序,使文件的信息不可读。

四、屏蔽所有信息的方法
如果我有一定的目的,想把所有的错误信息或正确信息都屏蔽掉,可以怎么办呢?这时可以利用数据流重定向,使它流向一个设备——/dev/null,它就像一个黑洞一样,可以吃掉任何导向这个设备的信息。
请看下面的例子:


无论是正确的信息还是错误的信息,它都能吃掉。

五、何时使用数据流重定向
既然我们知道了数据流的重定向,那么什么时候要使用数据流重定向呢?数据流重定向一般应用于:
1、屏幕输出的信息很重要,而且我们需要将它保存下来;
2、后台执行中的程序,不希望它干扰屏幕正常的输出结果;
3、一些系统的例行命令的执行结果,希望它能够保存下来;
4、一些执行命令的可能已知出错信息时,想以“2>/dev/null”将它屏蔽掉;
5、错误信息和正确信息需要分别输出;

初窥Linux 之 数据流重定向的更多相关文章

  1. 【linux】linux的数据流重定向

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

  2. 【Linux】数据流重定向

    数据流重定向(redirect)就是将某个命令执行后应该要出现在屏幕上的数据,给它传输到其他的地方,例如文件或设备(打印机之类的).这玩意在Linux的命令行模式下很重要,尤其是想要将某些数据存储下来 ...

  3. linux——(8)数据流重定向、管道命令

    概念一:数据流重定向 数据流分输入流和输出流,还有一个标准错误流,负责管理出错信息,比如一般的命令的输出会输出到屏幕上,我们可以用重定向让他输入到某个文件内. 相关操作: 1,标准输入(stdin): ...

  4. 【转】Linux 之 数据流重定向

    转自:http://www.linuxidc.com/Linux/2012-09/69764.htm linux在你登入时,便将默认的标准输入.标准输出.标准错误输出安排成你的终端.I/O重定向就是你 ...

  5. 初窥Linux 之 我最常用的20条命令

    魏公 SecureCRTuname -avisftppartition,fsshell kshell,bshelluser,groupIPTables文件数,内核参数tail,less/var/log ...

  6. 初窥Linux 之 区分硬连接和软连接

    一.Linux下的两种连接文件及创建方式 在Linux下面的连接文件有两种——软连接和硬连接,虽然都是连接文件,但两者却有很大的区别.一种是类似于Windows的快捷方式功能的文件(或目录),这种连接 ...

  7. 初窥Linux 之 文件权限

    一.用户与用户组 为了更好地理解文件权限,我们需要先有用户和用户组的概念.因为在Linux里面,任何一个文件都具有“User(用户).Group(用户组)及Others(其他用户)”3种身份的个别权限 ...

  8. 初窥Linux之我最常用的20条命令

    1.cd命令   这是一个非常基本,也是大家经常需要使用的命令,它用于切换当前目录,它的参数是要切换到的目录的路径,可以是绝对路径,也可以是相对路径.如: cd /root/Docements # 切 ...

  9. 初窥Linux 之 最常用20条命令

    玩过Linux的人都会知道,Linux中的命令的确是非常多,但是玩过Linux的人也从来不会因为Linux的命令如此之多而烦恼,因为我们只需要掌握我们最常用的命令就可以了.当然你也可以在使用时去找一下 ...

随机推荐

  1. Linux页快速缓存与回写机制分析

    參考 <Linux内核设计与实现> ******************************************* 页快速缓存是linux内核实现的一种主要磁盘缓存,它主要用来降低 ...

  2. SQL Server中存储过程比直接运行SQL语句慢的原因

    原文:SQL Server中存储过程比直接运行SQL语句慢的原因 在很多的资料中都描述说SQLSERVER的存储过程较普通的SQL语句有以下优点: 1.       存储过程只在创造时进行编译即可,以 ...

  3. 请确保在编译时已将“AjaxControlToolkit.Properties.Resources.NET4.resources”正确嵌入或链接到程序集“AjaxControlToolkit”

    原文:请确保在编译时已将"AjaxControlToolkit.Properties.Resources.NET4.resources"正确嵌入或链接到程序集"AjaxC ...

  4. installshield制作的安装包卸载时提示重启动的原因以及解决办法

    原文:installshield制作的安装包卸载时提示重启动的原因以及解决办法 有时候卸载installshield制作的安装包程序,卸载完会提示是否重启电脑以完成所有卸载,产生这个提示的常见原因有如 ...

  5. ATMEGA16 IOport相关汇总

    ATMEGA16 IOport总的共同所有权有关的寄存器有三个DDRX.PORTX和PINX. 假设你想IO动作基本上与这三个寄存器操纵.DDRX也被称为数据方向寄存器.PORTX所谓数据寄存器.PI ...

  6. HDU4565 && 2013年长沙邀请赛A题

    部分转自http://blog.csdn.net/crazy______/article/details/9021169 #include<cstdio> using namespace ...

  7. leetcode第23题--Swap Nodes in Pairs

    Problem: Given a linked list, swap every two adjacent nodes and return its head. For example,Given 1 ...

  8. WPF随手小记之二 ——改变DataGrid样式

    大部分时候我们并不需要手动改变DataGrid的样式,因为用默认的其实也看得过去,而且在DataGrid中的数据也远比外观重要. 但总有时候,我们需要做点必要的UI修改来使DataGrid更美观. 一 ...

  9. 基于Quqrtz.NET 做的任务调度管理工具

    基于Quqrtz.NET 做的任务调度管理工具 国庆前,需求让我看了一下任务调度的数据表设计.和之前一样,有100多个字段,p1 ~ p100, 我说这是干嘛啊!按这写,写死去了! 然后在网上搜了一下 ...

  10. Linux根目录下文件说明

    /bin:存放最常用命令: /boot:启动Linux的核心文件: /dev:设备文件: /etc:存放各种配置文件: /home:用户主目录: /lib:系统最基本的动态链接共享库: /mnt:一般 ...