写SHELL好久了,经常被异常困扰,可竟然坚持了若干年没用过,回想以前服务过的公司,阿弥陀佛,罪过罪过。废话少说,希望此篇文章可以协助大家和我彻底结束SHELL脚本就是LINUX命令集合的初级阶段。

一、STDOUT、STDERR

如果要获取SHELL脚本的异常输出,就需要首先理解SHELL命令的标准输出STDOUT、标准错误STDERR。

当我们在编写 shell 脚本时,我们会非常频繁地操作执行命令的标准输入stdin、标准输出stdout、标准错误stderr。当我们执行脚本文件或者执行一个 shell 命令的时候,单从终端输出我们很难区分哪些是标准输出,哪些是标准错误。所以我们把这些信息重定向特定的地方,以便于我们分析脚本文件及 shell 命令的执行情况,这就用到了文件描述符。文件描述符是与打开文件或者数据流相关联的整数,0、1、2 是系统保留的三个文件描述符,分别对应标准输入、标准输出、标准错误。Linux Shell 使用 " > " ">>" 进行对文件描述符进行重定位。例如代码:

#!/bin/bash
ls liqiu > /tmp/error #很明显这是一个错误的命令
echo $? #捕获上一条命令的输出 (if 0 正常 else 错误)
ls -l > /tmp/log
echo $?

输出结果:

@~ $ ~/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>"; 上面的代码等价于:

#!/bin/bash
ls liqiu 1> /tmp/error
echo $? #捕获上一条命令的输出 (if 0 正常 else 错误)
ls -l 1> /tmp/log
echo $?

二、捕获异常

所以要捕获异常,需要修改代码:

#!/bin/bash
ls liqiu > /tmp/error 2>&1 #使用 " 2>&1" 把标准错误 stderr 重定向到标准输出 stdout ;
echo $? #捕获上一条命令的输出 (if 0 正常 else 错误)
ls -l > /tmp/log
echo $?

执行之后,发现错误信息出现在了文件/tmp/log中。

@~ $ cat /tmp/error
ls: liqiu: No such file or directory
@~ $

转载地址:https://www.cnblogs.com/liqiu/p/4106040.html

写SHELL好久了,经常被异常困扰,可竟然坚持了若干年没用过,回想以前服务过的公司,阿弥陀佛,罪过罪过。废话少说,希望此篇文章可以协助大家和我彻底结束SHELL脚本就是LINUX命令集合的初级阶段。

一、STDOUT、STDERR

如果要获取SHELL脚本的异常输出,就需要首先理解SHELL命令的标准输出STDOUT、标准错误STDERR。

当我们在编写 shell 脚本时,我们会非常频繁地操作执行命令的标准输入stdin、标准输出stdout、标准错误stderr。当我们执行脚本文件或者执行一个 shell 命令的时候,单从终端输出我们很难区分哪些是标准输出,哪些是标准错误。所以我们把这些信息重定向特定的地方,以便于我们分析脚本文件及 shell 命令的执行情况,这就用到了文件描述符。文件描述符是与打开文件或者数据流相关联的整数,0、1、2 是系统保留的三个文件描述符,分别对应标准输入、标准输出、标准错误。Linux Shell 使用 " > " ">>" 进行对文件描述符进行重定位。例如代码:

#!/bin/bash
ls liqiu > /tmp/error #很明显这是一个错误的命令
echo $? #捕获上一条命令的输出 (if 0 正常 else 错误)
ls -l > /tmp/log
echo $?

输出结果:

@~ $ ~/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>"; 上面的代码等价于:

#!/bin/bash
ls liqiu 1> /tmp/error
echo $? #捕获上一条命令的输出 (if 0 正常 else 错误)
ls -l 1> /tmp/log
echo $?

二、捕获异常

所以要捕获异常,需要修改代码:

#!/bin/bash
ls liqiu > /tmp/error 2>&1 #使用 " 2>&1" 把标准错误 stderr 重定向到标准输出 stdout ;
echo $? #捕获上一条命令的输出 (if 0 正常 else 错误)
ls -l > /tmp/log
echo $?

执行之后,发现错误信息出现在了文件/tmp/log中。

@~ $ cat /tmp/error
ls: liqiu: No such file or directory
@~ $

SHELL异常处理(转载)的更多相关文章

  1. SHELL异常处理

    写SHELL好久了,经常被异常困扰,可竟然坚持了若干年没用过,回想以前服务过的公司,阿弥陀佛,罪过罪过.废话少说,希望此篇文章可以协助大家和我彻底结束SHELL脚本就是LINUX命令集合的初级阶段. ...

  2. bash之局部变量与子shell(转载)

    shell是每个接触linux.unix用户不得不会的工具,谈到shell就又联系到bash,因为这个shell是普遍被使用的.那么bash中的局部变量和子shell你是否能熟练掌握呢?这里推荐一本学 ...

  3. SHELL十三问[转载自CU论坛]

    原文地址:http://bbs.chinaunix.net/thread-218853-1-1.html 一.为什么称作shell? http://bbs.chinaunix.net/viewthr ...

  4. Spring Boot中Web应用的统一异常处理 转载来自翟永超

    我们在做Web应用的时候,请求处理过程中发生错误是非常常见的情况.Spring Boot提供了一个默认的映射:/error,当处理中抛出异常之后,会转到该请求中处理,并且该请求有一个全局的错误页面用来 ...

  5. Shell十三问[转]

    Shell十三问 转载于网络,稍加整理. (一) 为何叫做Shell? 我们知道计算机的运作不能离开硬件,但使用者却无法直接对硬件作驱动,硬件的驱动只能透过一个称为"操作系统(Operati ...

  6. 这些年我们一起搞过的持续集成~Jenkins+Perl and Shell script

    这些年我们一起搞过的持续集成~Jenkins+Perl and Shell script ##转载注明出处:http://www.cnblogs.com/wade-xu/p/4378224.html ...

  7. HBase Shell 十大花式玩儿法

    前言:工欲善其事必先利其器,今天给大家介绍一下HBase Shell十大花式利器,在日常运维工作中,可以试着用起来. 1. 交互模式 也就是我们最常用到的Shell命令行的方式. $ hbase sh ...

  8. 【转载】Java学习笔记

    转载:博主主页 博主的其他笔记汇总 : 学习数据结构与算法,学习笔记会持续更新: <恋上数据结构与算法> 学习Java虚拟机,学习笔记会持续更新: <Java虚拟机> 学习Ja ...

  9. Android种 adb是什么(转)

    提到adb.exe,一直关注我们Android系列教程的朋友们应该不会感到陌生,因为无论取得 Root权限或者刷机的时候我们都通过adb直接操作管理Android手机,但是可能大多数对于adb仅仅局限 ...

随机推荐

  1. 发行NEO的NEP-5合约代币

    NEO常见的资产有三种 TOKEN (全局资产) Share (全局资产,股份 ) NEP-5 (合约代币,相当于ETH的ERC20) NEP-5 合约代码 https://github.com/AN ...

  2. flask插件系列之Flask-WTF表单

    flask_wtf是flask框架的表单验证模块,可以很方便生成表单,也可以当做json数据交互的验证工具,支持热插拔. 安装 pip install Flask-WTF Flask-WTF其实是对w ...

  3. 关于text-decoration无法清除继承的问题

    因为text-decoration的值可以叠加,所以即使设置了none,浏览器也是看成是叠加,而不是清除的意思.

  4. css3动画详解

    一.Keyframes介绍: Keyframes被称为关键帧,其类似于Flash中的关键帧.在CSS3中其主要以“@keyframes”开头,后面紧跟着是动画名称加上一对花括号“{…}”,括号中就是一 ...

  5. java在图片上写字

  6. C/C++——C语言跳出多重循环方法

    c语言的break语句只能跳出离它最近的一层循环,但是我们有时候需要跳出多层循环,以下有几种跳出多重循环的方法: 1. 使用goto ; i < MAX1; i++) { ; j < MA ...

  7. HDU 3342 Legal or Not(拓扑排序判断成环)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3342 题目大意:n个点,m条有向边,让你判断是否有环. 解题思路:裸题,用dfs版的拓扑排序直接套用即 ...

  8. xcode7 安装 KSImageNamed

    1.前往Xcode7的插件文件夹,路径如下: ~/Library/Developer/Xcode/Plug-ins 如果有KSImageNamed,右键删除 2.在终端直接输入命令行: default ...

  9. MySQL之基础功能

    一.视图 视图:是一个虚拟表,其内容由查询定义.同真实的表一样,视图包含一系列带有名称的列和行数据 视图有如下特点: 1. 视图的列可以来自不同的表,是表的抽象和逻辑意义上建立的新关系. 2. 视图是 ...

  10. hdu 1597(矩阵快速幂)

    1597: 薛XX后代的IQ Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 228  Solved: 55[Submit][Status][Web Bo ...