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/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
@~ $
时间: 2024-10-05 04:59:59

SHELL异常处理的相关文章

异常处理、模块包、时间模块、subprocess(调用shell命令)

异常处理 捕捉异常可以使用try/except语句.try/except语句用来检测try语句块中的错误,从而让except语句捕获异常信息并处理.如果你不想在异常发生时结束你的程序,只需在try里捕获它. 更多的异常关键字:http://www.runoob.com/python/python-exceptions.html Exception:常规错误的基类IOError:输入/输出操作失败例子1:写入信息到tt.txt文件中,如果报错,就打印错误 try: with open('tt.tx

python基础 -- 异常处理try的使用及一些思考

成长的道路上,难免会迷茫,难免会不知所措,能做的就是拥有一个不灭的信念,并一路坚持到底.不要丢掉希望,要坚信,明天会更好. 算是自己这周工作的小体会吧.第一天新领了公司配的笔记本,然后配置环境.下午以及第二天都是熟悉公司自己根据Scrapy框架稍作封装的框架,然后一步步调试看程序执行顺序. 第二天下午以及第三天,完成了一个还算简单的爬虫,只是抓取了一个美国的官网.健壮性比较差~~~ 使用xpath抓取时,有些迷茫.原因是网站做的标签有些混乱.或者说是自己经验比较少吧,以后继续补充些这些方面的知识

Python运行环境与异常处理

1.Python的启动 Python的命令格式: python [option] ... [-c cmd | -m mod | file | -] [arg] ... 选项 描述 -J 启动将从Python3中删除或更改某些功能的警告 -B 阻止在导入时创建.pyc或.pyo文件 -E 忽略环境变量 -h 打印所有可用命令行选项的列表 -i 在程序执行后进入交互模式 -m module 以脚本的形式运行库模块module -O 优化模式 -OO 优化模式,在创建.pyo文件时删除文档字符串 -Q

erlang shell 命令中文使用手册

转载自--没有开花的树:http://blog.csdn.net/mycwq/article/details/16858805 整理的很完整,所以拿过来了, erlang shell 是在命令行模式下使用命令和 erlang 交互的工具.erlang shell功能十分强大,可以直接编译.加载.执行.调试模块等等,完全可以将shell做为erlang项目的终端使用.文章将对erlang shell 命令做介绍,还简单以示例说明. 打开erlang shell的帮助信息,在这里变成中文了.同时可以

python专题-异常处理(基础)

之前在学习python的时候有整理过python异常处理的文章,不够简单也不够完整,所以决定再整理一篇,算做补充. http://www.cnblogs.com/cmt110/p/7464748.html python shell >>> open('abc.txt','r') Traceback (most recent call last): File "<stdin>", line 1, in <module> IOError: [Err

Python网络编程day-1[异常处理,socket]

异常处理: 错误: 1.语法错误:程序运行检测到语法错误会直接抛出,并终止程序运行. 2.逻辑错误:程序在运行中遇到逻辑错误,系统会询问程序是否处理异常,程序没有处理系统会抛出异常,并终止程序运行. 异常: 程序运行过程中发生的错误. 异常分为三部分: 追踪信息,异常类,异常值. n = input('>>>: ').strip() s = n + 1 print(s) 执行结果: D:\Python\Python36-32\python.exe E:/Python/DAY-23/day

编写Shell脚本的最佳实践

前言 由于工作需要,最近重新开始拾掇shell脚本.虽然绝大部分命令自己平时也经常使用,但是在写成脚本的时候总觉得写的很难看.而且当我在看其他人写的脚本的时候,总觉得难以阅读.毕竟shell脚本这个东西不算是正经的编程语言,他更像是一个工具,用来杂糅不同的程序供我们调用.因此很多人在写的时候也是想到哪里写到哪里,基本上都像是一段超长的main函数,不忍直视.同时,由于历史原因,shell有很多不同的版本,而且也有很多有相同功能的命令需要我们进行取舍,以至于代码的规范很难统一. 考虑到上面的这些原

python学习道路(day8note)(抽象类,类的方法,异常处理,socket编程)

1.#面向对象 #抽象接口 === 抽象类 #就是架构师给你一个架子,你们去写,如果满足不了直接报错 1 #python2 2 print("python2---抽象类".center(20,'#')) 3 import abc #需要在python2中测试,如果直接运行会报错 4 #因为没有调用send方法 5 class Alert(object): 6 '''报警基类''' 7 __metaclass__ = abc.ABCMeta 8 @abc.abstractmethod 9

封装,多态,反射,异常处理,网络编程

接口与归一化设计(python中使用继承的方式) 抽象类 import abc class Interface(metaclass=abc.ABCMeta): #定义接口Interface类来模仿接口的概念,python中 #没有interface关键字来定义一个接口 all_type='file' #只定义功能集合而不实现具体的功能 @abc.abcstractmethod def read(self): # 定义接口函数read pass @abc.abcstractmethod def w