zoukankan      html  css  js  c++  java
  • 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`执行错误,说明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
    @~ $

     

  • 相关阅读:
    C#读写者线程(用AutoResetEvent实现同步)(转载)
    详解大端模式和小端模式(转载)
    C/C++程序员应聘试题剖析(转载)
    strcpy和memcpy的区别(转载)
    基于mini2440的Qt移植
    分布式服务以及跨平台开发清单(全栈之路)
    软件开发模式对比(瀑布、迭代、螺旋、敏捷)
    大数开方 ACM-ICPC 2018 焦作赛区网络预赛 J. Participate in E-sports
    啊啊
    括号问题
  • 原文地址:https://www.cnblogs.com/liqiu/p/4106040.html
Copyright © 2011-2022 走看看