首页 > 学院 > 开发设计 > 正文

Linux 数据流重定向

2019-11-06 06:23:40
字体:
来源:转载
供稿:网友
一、什么是数据流重定向在说数据流重定向之前,先来说说数据流的概念吧。数据流分为三种:标准输入(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、错误信息和正确信息需要分别输出;
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表