写SHELL很久了,常常被异常困扰,可居然坚持了若干年没用过,回想之前服务过的公司,阿弥陀佛,罪过罪过。废话少说,但愿此篇文章能够协助你们和我完全结束SHELL脚本就是LINUX命令集合的初级阶段。shell
若是要获取SHELL脚本的异常输出,就须要首先理解SHELL命令的标准输出STDOUT、标准错误STDERR。bash
当咱们在编写 shell 脚本时,咱们会很是频繁地操做执行命令的标准输入stdin、标准输出stdout、标准错误stderr。当咱们执行脚本文件或者执行一个 shell 命令的时候,单从终端输出咱们很难区分哪些是标准输出,哪些是标准错误。因此咱们把这些信息重定向特定的地方,以便于咱们分析脚本文件及 shell 命令的执行状况,这就用到了文件描述符。文件描述符是与打开文件或者数据流相关联的整数,0、一、2 是系统保留的三个文件描述符,分别对应标准输入、标准输出、标准错误。Linux Shell 使用 " > " ">>" 进行对文件描述符进行重定位。例如代码:svn
#!/bin/bash ls liqiu > /tmp/error #很明显这是一个错误的命令 echo $? #捕获上一条命令的输出 (if 0 正常 else 错误) ls -l > /tmp/log echo $?
输出结果:spa
@~ $ ~/study/test.sh ls: liqiu: No such file or directory 1 0
1 说明`ls liqiu > /tmp/error`执行错误,0 说明ls -l > /tmp/log执行成功。那么但愿的记过是/tmp/error报错错误日志,/tmp/log保存正确的结果,可查看文件发现不是这么回事。日志
@~ $ more /tmp/log total 0 drwx------ 3 liqiu staff 102 4 26 2014 Applications drwx------+ 4 liqiu staff 136 11 2 17:06 Desktop drwxr-xr-x 4 liqiu staff 136 10 18 09:56 svn @~ $ more /tmp/error @~ $
缘由在于:重定位运算符 ">" 的默认参数为标准输出 stdout ,即 1 ; 因此 ">" 等价于 "1>"; 上面的代码等价于: code
#!/bin/bash ls liqiu 1> /tmp/error echo $? #捕获上一条命令的输出 (if 0 正常 else 错误) ls -l 1> /tmp/log echo $?
因此要捕获异常,须要修改代码:blog
#!/bin/bash ls liqiu > /tmp/error 2>&1 #使用 " 2>&1" 把标准错误 stderr 重定向到标准输出 stdout ; echo $? #捕获上一条命令的输出 (if 0 正常 else 错误) ls -l > /tmp/log echo $?
执行以后,发现错误信息出如今了文件/tmp/log中。io
@~ $ cat /tmp/error ls: liqiu: No such file or directory @~ $