写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/logecho $?

输出结果:

@~ $ ~/study/test.sh

ls: liqiu: Nosuch file or directory1

0

1 说明`ls liqiu > /tmp/error`执行错误,0说明ls -l > /tmp/log执行成功。那么希望的记过是/tmp/error报错错误日志,/tmp/log保存正确的结果,可查看文件发现不是这么回事。

@~ $ more /tmp/logtotal0drwx------ 3 liqiu staff 102 4 26 2014Applications

drwx------+ 4 liqiu staff 136 11 2 17:06Desktopdrwxr-xr-x 4 liqiu staff 136 10 18 09:56svn

@~ $ more /tmp/error

@~ $

原因在于:重定位运算符 ">" 的默认参数为标准输出 stdout ,即 1 ; 所以 ">" 等价于 "1>"; 上面的代码等价于:

#!/bin/bash

ls liqiu 1> /tmp/error

echo $? #捕获上一条命令的输出 (if 0 正常 else 错误)

ls -l 1> /tmp/logecho $?

二、捕获异常

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

#!/bin/bash

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

ls -l > /tmp/logecho $?

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

@~ $ cat /tmp/error

ls: liqiu: Nosuch file or directory

@~ $

写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/logecho $?

输出结果:

@~ $ ~/study/test.sh

ls: liqiu: Nosuch file or directory1

0

1 说明`ls liqiu > /tmp/error`执行错误,0说明ls -l > /tmp/log执行成功。那么希望的记过是/tmp/error报错错误日志,/tmp/log保存正确的结果,可查看文件发现不是这么回事。

@~ $ more /tmp/logtotal0drwx------ 3 liqiu staff 102 4 26 2014Applications

drwx------+ 4 liqiu staff 136 11 2 17:06Desktopdrwxr-xr-x 4 liqiu staff 136 10 18 09:56svn

@~ $ more /tmp/error

@~ $

原因在于:重定位运算符 ">" 的默认参数为标准输出 stdout ,即 1 ; 所以 ">" 等价于 "1>"; 上面的代码等价于:

#!/bin/bash

ls liqiu 1> /tmp/error

echo $? #捕获上一条命令的输出 (if 0 正常 else 错误)

ls -l 1> /tmp/logecho $?

二、捕获异常

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

#!/bin/bash

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

ls -l > /tmp/logecho $?

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

@~ $ cat /tmp/error

ls: liqiu: Nosuch file or directory

@~ $

bash 抓捕异常_SHELL异常处理(转载)相关推荐

  1. bash 抓捕异常_实现简单的监控脚本(Bash的执行和异常捕获)

    当我们需要监控服务运行状态时,一般的策略是写定时脚本,定时执行探测服务状态,如果出现预期外情况,就报警.那么第一步我们就需要学会写一个监控脚本,这里我们会讲到bash的执行环境和异常捕获,以及一些简单 ...

  2. bash 抓捕异常_五种异常处理机制:try...except与try...finally

    (try finally) Python try except异常处理详解 python标准异常 异常名称描述 BaseException 所有异常的基类 SystemExit 解释器请求退出 Key ...

  3. 异常以及异常处理框架探析

    摘要:本文主要与您探讨异常以及异常处理相关方面的一些知识,主要包括检查异常与非检查异常的理解,多视角观察理解异常,进而探讨关于构建稳健且可扩展的异常框架方面的一些设计原则. 概述 一般情况下,企业级应 ...

  4. 异常和异常处理(windows平台)

    [翻译]异常和异常处理(windows平台) 翻译的不好,莫怪. 原文地址: http://crashrpt.sourceforge.net/docs/html/exception_handling. ...

  5. java 数字运算异常_Java基础之:异常及异常处理

    Java基础之:异常及异常处理 我们将java程序执行过程中出现的不正常现象称为异常,例如:之前遇到的数组下标越界异常,空指针异常等等 执行过程中发生的异常事件分为两类: Error(错误):Java ...

  6. Java异常与异常处理简单使用

    Java异常与异常处理简单使用 参考文章: (1)Java异常与异常处理简单使用 (2)https://www.cnblogs.com/freeweb/p/4823815.html 备忘一下.

  7. MySQL定义异常和异常处理方法

    MySQL定义异常和异常处理方法 参考文章: (1)MySQL定义异常和异常处理方法 (2)https://www.cnblogs.com/yizitrd/p/5445071.html 备忘一下.

  8. java 异常处理的关键字_java异常,异常处理,异常类 关键字:throws 和 throw 自定义的异常类...

    packagecn.kecheng;importjava.util.Scanner;/**异常:异常是指在程序的运行过程中所发生的不正常的情况,它会中断正在运行的程序 异常处理机制:java中通过异常 ...

  9. Ubuntu 执行 bash 脚本异常

    Ubuntu 执行 bash 脚本异常 文章目录 Ubuntu 执行 bash 脚本异常 执行报错 解决办法 参考 执行报错 [dev@my-ubuntu ~/packages/base_server ...

最新文章

  1. MediaWiki使用指南
  2. 控制dcom程序使用端口_使用VS Code调试.net控制台应用程序的方法
  3. npm run dev (明明有.vue文件),却报错 cannot GET
  4. resin4 发布war包
  5. cisco路由器 三层交换机简单环境配置实例(图)
  6. 递归下降分析法的基本思想。_还不懂这八大算法思想,刷再多题也白搭!
  7. oracle数组的使用
  8. 带徽标的Bootstrap 3 Navbar
  9. 【Notification】屏蔽特定应用的通知提示
  10. Retrofit之CallAdapter简单解析
  11. c语言sigaction,C语言中的Sigaction和setitimer
  12. linux能安装cad快速看图不,ubuntu下能过wine安装cad快速看图
  13. 弗雷歇距离 matlab,离散Fréchet(弗雷歇) 距离评价曲线相似度
  14. LeetCode:459.重复的子字符串 Python3 | 判断输入的字符串是不是可以由子串多次重复构成
  15. 【hadoop】进阶篇一:MapReduce之Job的提交
  16. php 2010excel,Excel2010 工作薄文件扩展名是什么?
  17. 挑食有理——罗敏娜集团总裁卓顺发养生之道
  18. 射频板PCB设计--微带线
  19. 为触屏手机而设计系列1—拇指操作的热区死角与控件尺寸
  20. 弘辽科技:刘强东下“重手”

热门文章

  1. php实现论坛系统,详解PHP论坛实现系统的思路
  2. 【离散数学】含有两个量词的谓词逻辑公式
  3. 题解 P1091 【合唱队形】
  4. PostgreSQL 10.1 手册_部分 IV. 客户端接口_第 33 章 libpq - C 库_33.11. 杂项函数
  5. 前端架构gulp与webpack(知识点整理)
  6. 大数据是如何助德国队打进欧洲杯半决赛的?
  7. Facebook在欧洲推出网络极端内容与仇恨言论打压行动
  8. bcrypt对密码加密的一些认识(学习笔记)
  9. Object-C中方法
  10. http://bbs.winos.cn/viewthread.php?tid=1147extra=page=2