知识体系:
#回顾重定向
#标准输入和输出
#报告错误
#丢弃数据
#创建日志文件
这里主要讲述如何将脚本重定向到linux系统的各个位置.
1、了解输入和输出
我们知道显示脚本输出的方法有两种:
*在监视器屏幕上显示
*将输出重定向到文件
下面主要讲述如何使用标准的linux输入和输出体系满足将脚本输出定向到特定位置的需求.
1.1、标准文件描述符
linux使用文件描述符来标识每个文件对象,每个进程最多有9个可以打开文件的描述符(且非零),bash shell为特殊需要保留了前三个文件描述符(0、1、2),如下所示:
**************************************
文件描述符 缩写 描述
0 STDIN 标准输入
1 STDOUT 标准输出
2 STDERR 标准错误
**************************************
shell使用他们将shell中的默认输入输出重定向到相应的位置,默认就是监视器屏幕了.
下面简单讲述下这三个保留的文件描述符:
1》STDIN
STDIN文件描述符引用shell的标准输入,对于终端接口的标准输入就是键盘了.当然,我们可以使用输入重定向符号(<)也可以使其读取文件中的数据,跟键盘输入时一样的道理.先来看个例子:
[root@wzp ~]# cat
i am twentyfour , who are you ?
i am twentyfour , who are you ?
我直接输入cat后回车,结果我输入什么内容,系统就显示一样的内容.
这就是cat命令通过STDIN输入数据的示例.
[root@wzp ~]# vim testfile
[root@wzp ~]# cat < testfile
aaaaaaaaaaaa
bbbbbbbbbbbb
cccccccccccc
现在cat命令使用包含在testfile文件的中行作为输入,也是标准输入.
2》STDOUT
STDOUT文件描述符引用shell的标准输出,在终端接口的标准输出就是终端监视器.我们可以使用输出重定向(>)或者追加(>>)向文件添加数据.对于这个都是很好理解的,看个例子:
[root@wzp ~]# ls > 51cto.test
[root@wzp ~]# cat 51cto.test
51cto.test
anaconda-ks.cfg
Desktop
install.log
install.log.syslog
linux-linkto-mysql
login-mysql
mbox
sendto-mysql
如上把定向到监视器的内容重定向到文件中.
3》STDERR
STDERR文件描述符处理错误消息,默认情况下将所有错误消息显示在监视器上,具体应用下来讲述.
1.2、重定向错误
重定向STDERR数据的时候只要定义好STDERR文件描述符即可,这里头分两种情况的数据重定向.
(1)先来第一种:仅重定向错误消息
我们已经知道ETDERR文件描述符值为2,在重定向符号前附加2即可把错误消息重定向到具体的位置去,看个例子:
[root@wzp ~]# ll 51cto 2> errfile
[root@wzp ~]# cat errfile
ls: 51cto: 没有那个文件或目录
就是说明知道不存在51cto,然后去ll后把错误消息重定向到errfile中,而不是默认的显示在显示器上.下面的例子也如此:
[root@wzp ~]# ll 51cto.test 51cto 2>> errfile
-rw-r--r-- 1 root root 115 02-14 17:02 51cto.test
[root@wzp ~]# cat errfile
ls: 51cto: 没有那个文件或目录
ls: 51cto: 没有那个文件或目录
从结果都可以看出存在的文件显示在屏幕上,而不存在的文件的报错消息被追加到errfile文件中.
(2)还有一种是:重定向错误和数据
既然要分开处理错误消息和正确的数据显示,我们就可以通过1>符号进行标准输出重定向,和2>进行错误消息重定向,看个例子就明白了:
[root@wzp ~]# ls -al 51cto.test install.log linux rhca 1> exist 2> error
[root@wzp ~]# cat exist
-rw-r--r-- 1 root root 115 02-14 17:02 51cto.test
-rw-r--r-- 1 root root 27682 12-12 18:06 install.log
[root@wzp ~]# cat error
ls: linux: 没有那个文件或目录
ls: rhca: 没有那个文件或目录
存在的文件重定向到exist文件中,不存在的文件把报错信息重定向到error中,这就是灵活使用1>和2>符号的效果.
当然,假如你想把正确输出的错误输出都重定向到一个文件的时候可以使用特殊的重定向符号:&> 先来看个例子:
[root@wzp ~]# ls -al 51cto.test install.log linux rhca &> totalfile
[root@wzp ~]# cat totalfile
ls: linux: 没有那个文件或目录
ls: rhca: 没有那个文件或目录
-rw-r--r-- 1 root root 115 02-14 17:02 51cto.test
-rw-r--r-- 1 root root 27682 12-12 18:06 install.log
我们看到totalfile包含的所有信息,并且是按照顺序排列两类信息.
|