一、什么是数据流重定向
在说数据流重定向之前,先来说说数据流的概念吧。数据流分为三种:标准输入(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. 文字超出DIV后,隐藏文字并显示...

    <html> <head> <style type="text/css"> #cs{width:100px;height:50px;line-h ...

  2. 苹果浏览器Safari对JS函数库中newDate()函数中的参数的解析中不支持形如“2020-01-01”形式

    苹果浏览器safari对new Date('1937-01-01')不支持,用.replace(/-/g, "/")函数替换掉中划线即可 如果不做处理,会报错:invalid da ...

  3. 非常多人不愿意承认汉澳sinox已经超过windows

    汉澳sinox採用的zfs和jail打造高可靠性存储server和矩阵计算机,这不是windows和linux能相提并论的. 只是非常多人立即出来出来反驳说,windows驱动程序多(就是支持硬件多) ...

  4. Python 2.7.3 Time与DateTime格式化

    import time import datetime class TimeX: '''时间工具,目前用于格式化时间''' @staticmethod def GetLocalTimeString_T ...

  5. 部分PC端安卓管理器使用强行断开重连的方法来连接手机,容易丢书数据,损坏数据

    最近发现部分PC端的安卓管理器,貌似是百度影音以及PPTV的安卓客户端,使用强行断开手机连接,然后重新连接手机的方法,来实现客户端程序连接手机. 此时,如果刚好正在复制文件,则复制的文件会损坏,并且基 ...

  6. Java 之JavaBean 、EJB 和POJO

    由于是创业公司,开发人员较少,所以公司临时决定让几个C的程序猿临时客串Java.所以避免不了有很多基础问题,今天就有两个人都问我,JavaBean和POJO的区别,我可按照自己的理解给他们大致说了下, ...

  7. [译]ava 设计模式之职责链

    (文章翻译自Java Design Pattern: Chain of Responsibility) 职责链模式的主要设计思想是为了构建一连串的处理单元,如果阈值满足的话那么这个单元就来处理这个请求 ...

  8. jquery简单异步读取xml文件

    $.ajax({            url: '../XmlFiles/Sm.xml',            async: true,            cache: false,      ...

  9. DataGridView的使用和批量修改

    DataGridView的属性:AllowUserToAddRows:如果为true允许用户添加行,false不允许用户添加行ReadOnly:true表示只读.不能修改单元格中的值,false可以对 ...

  10. Android服务开发经验——优雅地活着

    大多数的Android应用开发都会将注意力集中在界面功能上,只有少数应用会需要一个Service,尤其是一个长期运行的Service,去进行后台联网.环境检测.媒体播放等功能.Android环境下的S ...