1、什么事数据流重定向?
这得要由命令的执行结果谈起。一般来说,如果你要执行一个命令,通常他会是这样的,如下所示
我们执行一个命令的时候,这个命令可能会由文件读入数据,经过处理之后,再将命令返回的结果输出到屏幕上,上图中,standard output 与standard input以及standard error 分别代表”标准输出“、”标准输入“、”标准异常输出“
简单说,标准输出指的是命令执行所回传的正确信息,而标准错误输出可以理解为命令执行失败后,所回传的错误信息。
说了这么多,那什么事数据流重定向呢?
不管是正确的或者错误的数据都是默认输出到屏幕上的,那能不能通过某种机制将这这些信息输到别处呢?当然可以了,那就是数据流重定向的功能,数据流重定向可以将标准的输出,与标准的异常输出分别传到其他的文件或设备中去
传送时用的特殊字符如下:
1)标准输入(stdin):代码为0 ,使用0<或者0<<,当然前面的0可以省略,一般用就是<或者<<这样用。
2)标准输出(stdout):代码为1,使用1>或者1>>,当然前面的0可以省略,一般用就是>或者>>这样用。
3) 标准错误输出(stderr):代码为2,使用2>或者2>>
先写个实例感受一下,如下所示:
实例一:将命令返回的结果重定向到test.txt中 [root@bogon ~]# ls -la > test.txt [root@bogon ~]# tail test.txt drwx------. 2 root root 4096 Jul 21 01:52 .pulse -rw-------. 1 root root 256 Jul 21 01:51 .pulse-cookie -rw-------. 1 root root 218 Jul 21 01:54 .recently-used.xbel drwx------. 2 root root 4096 Jul 22 23:27 .ssh -rw-r--r--. 1 root root 129 Dec 3 2004 .tcshrc drwxr-xr-x. 2 root root 4096 Jul 21 01:51 Templates -rw-r--r--. 1 root root 0 Aug 15 02:43 test.txt drwxr-xr-x. 2 root root 4096 Jul 21 01:51 Videos -rw-------. 1 root root 9318 Aug 15 02:27 .viminfo -rw-------. 1 root root 0 Jul 21 01:54 .Xauthority
可以看到执行ls -la > test.txt屏幕上面没有任何的输出内容,但是text.txt这个文件被创建了。
这就是数据流重定向,将命令返回的结果重定向到了text.txt这个文件。
> 与 >>的区别:>、当后面接的文件没有时,他会创建,同时前面一个命令的返回结果重定向到text.txt中,同时如果text.txt这个文件中有内容,会被覆盖,如果不想被覆盖用>>这就是他们的区别!
标准的错误输出(2>或者2>>)也是一样的用法,当执行的命令发生错误时,才会将返回结果重定向到文件或者设备中
实例2:将命令执行的正确信息和错误信息分别重定向到不同的文件 [root@bogon ~]# find /home -name .bashrc > log_success 2> log_eror
2、/dev/null垃圾桶或者黑洞设备
如果我知道错误信息会发生,这个时候我想让错误信息忽略掉不显示也不存储?这个时候就得用/dev/null这个个垃圾桶了,
实例如下: 将错误的数据丢弃,屏幕上显示正确的数据 [root@bogon ~]# find /etc -name passwd 2> /dev/null
如果要将正确的数据与错误的数据同时写入同一个文件,这个时候linux是有讲究的,不能乱来,应该如下这么写:
实例:将正确的数据和错误的数据同时写入同一个文件 #这种写法程序是不会报错,但是会导致写入的顺序错乱(不要这样) [root@bogon ~]# find /etc -name passwd > log 2> log #如下两种方法都是linux推荐的写法 [root@bogon ~]# find /etc -name passwd > log 2>&1 (我习惯用这个) [root@bogon ~]# find /etc -name passwd &> log
第一种写法不行的原因,并不是程序跑起来会报错,而是由于同时两条数据同时写入一个文件时,没有做特殊处理(&这个符号),此时数据可能会交叉写入该文件内,造成次序错乱。
标准输入(standard input):<与<<
这个东西我之所以单独拿出来说,是因为这个跟上面的输出区别很大
什么事标准输入(stanin):我总结的,非常的经典的一句话:用文件内容来代替键盘的输入
采用例子驱动进行笔记!
实例:利用cat创建一个文件的简单流程 [root@bogon ~]# cat > file.txt aaa bbb ccc #这里按下[ctrl+d]来离开 [root@bogon ~]# cat file.txt aaa bbb ccc
由于加入>在cat后,所以那个file.txt会主动创建,二内容就是刚在键盘上面输入的那三行数据。
实例:用文件的内容来代替键盘的输入 [root@bogon ~]# cat > file1.txt < ./file.txt [root@bogon ~]# cat file1.txt aaa bbb ccc
<这个符号就是上面这么用,那么<<这个符号怎么用呢?
<<这个符号的含义是代表输入结束的意思,看实例如下:
[root@bogon ~]# cat > file << 'end' > www > bbb > ddd > end #在这里输入end,立刻马上结束,这个在脚本中非常有用,不用手动ctrl+d这么按 [root@bogon ~]# cat file www bbb ddd