数据流重定向

一、数据流重定向的实现
1、数据流重写向的分类
在Linux中利用shell实现数据流重定向是非常简单的,下面来介绍3种数据流的重定向。
1)标准输入(stdin):代码为0,使用<或者<<
2)标准输出(stdout):代码为1,使用>或者>>
3)标准错误输出(stderr):代码为2,使用2>或者2>>
看到这里,你可能还是很疑惑,那个代码有什么作用,<和<<有什么不同,>和>>又有什么不同?

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

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

cat file1

this if file1.

cat file1 > file2

cat file2

this is file1.

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

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

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

cat file1

this is file1.

cat file2

this is file1.

cat file1 >> file2

cat file1 >> file2

cat file1 >> file2

cat file2

this is file1.
this is file1.
this is file1.
this is file1.
同样的,使用这个命令,如果file2不存在于当前目录中,则系统会自动创建这个文件,而如果这个文件已经存在于当前目标下,则会把数据追加到该文件的末尾。
注:因为在默认情况下,>和>>分别表示1>和1>>,所以在命令中没有用到1>和1>>,因为它们是等价的。

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

cat file3

cat: file3: No such file or directory

cat file3 2> file4

cat file4

cat: file3: No such file or directory

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

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

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

cat > file5

this is file5.
^C

cat file5

this is file5.

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

cat > file6 < file5

cat file6

this is file5.
可以看到,它把file5的内容输入到file6中,代替先前的键盘输入。

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

cat > file7 << “end”

this is file7.
you can pass end to leave.
end

cat file7

this is file7.
you can pass end to leave.
之前的例子,都是使用ctrl+C来结束的,而这个例子,当你输入“end”时,自动退出了,当然这个结束符,你可以自己定义。这对写程序是有一定的好处的。

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

cat file1 > file8 2>&1

cat file1 &> file9

cat file1 > file10 2> file10

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

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

cat file11

cat: file11: No such file or directory

cat file11 2> /dev/null

cat file1

this is file1.

cat file1 > /dev/null

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值