bash 抓捕异常_SHELL异常处理(转载)
写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异常处理(转载)相关推荐
- bash 抓捕异常_实现简单的监控脚本(Bash的执行和异常捕获)
当我们需要监控服务运行状态时,一般的策略是写定时脚本,定时执行探测服务状态,如果出现预期外情况,就报警.那么第一步我们就需要学会写一个监控脚本,这里我们会讲到bash的执行环境和异常捕获,以及一些简单 ...
- bash 抓捕异常_五种异常处理机制:try...except与try...finally
(try finally) Python try except异常处理详解 python标准异常 异常名称描述 BaseException 所有异常的基类 SystemExit 解释器请求退出 Key ...
- 异常以及异常处理框架探析
摘要:本文主要与您探讨异常以及异常处理相关方面的一些知识,主要包括检查异常与非检查异常的理解,多视角观察理解异常,进而探讨关于构建稳健且可扩展的异常框架方面的一些设计原则. 概述 一般情况下,企业级应 ...
- 异常和异常处理(windows平台)
[翻译]异常和异常处理(windows平台) 翻译的不好,莫怪. 原文地址: http://crashrpt.sourceforge.net/docs/html/exception_handling. ...
- java 数字运算异常_Java基础之:异常及异常处理
Java基础之:异常及异常处理 我们将java程序执行过程中出现的不正常现象称为异常,例如:之前遇到的数组下标越界异常,空指针异常等等 执行过程中发生的异常事件分为两类: Error(错误):Java ...
- Java异常与异常处理简单使用
Java异常与异常处理简单使用 参考文章: (1)Java异常与异常处理简单使用 (2)https://www.cnblogs.com/freeweb/p/4823815.html 备忘一下.
- MySQL定义异常和异常处理方法
MySQL定义异常和异常处理方法 参考文章: (1)MySQL定义异常和异常处理方法 (2)https://www.cnblogs.com/yizitrd/p/5445071.html 备忘一下.
- java 异常处理的关键字_java异常,异常处理,异常类 关键字:throws 和 throw 自定义的异常类...
packagecn.kecheng;importjava.util.Scanner;/**异常:异常是指在程序的运行过程中所发生的不正常的情况,它会中断正在运行的程序 异常处理机制:java中通过异常 ...
- Ubuntu 执行 bash 脚本异常
Ubuntu 执行 bash 脚本异常 文章目录 Ubuntu 执行 bash 脚本异常 执行报错 解决办法 参考 执行报错 [dev@my-ubuntu ~/packages/base_server ...
最新文章
- MediaWiki使用指南
- 控制dcom程序使用端口_使用VS Code调试.net控制台应用程序的方法
- npm run dev (明明有.vue文件),却报错 cannot GET
- resin4 发布war包
- cisco路由器 三层交换机简单环境配置实例(图)
- 递归下降分析法的基本思想。_还不懂这八大算法思想,刷再多题也白搭!
- oracle数组的使用
- 带徽标的Bootstrap 3 Navbar
- 【Notification】屏蔽特定应用的通知提示
- Retrofit之CallAdapter简单解析
- c语言sigaction,C语言中的Sigaction和setitimer
- linux能安装cad快速看图不,ubuntu下能过wine安装cad快速看图
- 弗雷歇距离 matlab,离散Fréchet(弗雷歇) 距离评价曲线相似度
- LeetCode:459.重复的子字符串 Python3 | 判断输入的字符串是不是可以由子串多次重复构成
- 【hadoop】进阶篇一:MapReduce之Job的提交
- php 2010excel,Excel2010 工作薄文件扩展名是什么?
- 挑食有理——罗敏娜集团总裁卓顺发养生之道
- 射频板PCB设计--微带线
- 为触屏手机而设计系列1—拇指操作的热区死角与控件尺寸
- 弘辽科技:刘强东下“重手”
热门文章
- php实现论坛系统,详解PHP论坛实现系统的思路
- 【离散数学】含有两个量词的谓词逻辑公式
- 题解 P1091 【合唱队形】
- PostgreSQL 10.1 手册_部分 IV. 客户端接口_第 33 章 libpq - C 库_33.11. 杂项函数
- 前端架构gulp与webpack(知识点整理)
- 大数据是如何助德国队打进欧洲杯半决赛的?
- Facebook在欧洲推出网络极端内容与仇恨言论打压行动
- bcrypt对密码加密的一些认识(学习笔记)
- Object-C中方法
- http://bbs.winos.cn/viewthread.php?tid=1147extra=page=2