trap 命令

基本格式: trap command sig1 sig2 ... sigN
    有3种信号可以捕获:
    EXIT : 从函数中退出, 或整个脚本执行完毕
    ERR:   当一条命令返回非0状态码, 即命令执行不成功
    DEBUG: 脚本汇总每一条命令执行前

演示 DEBUG (一般使用这个方法查看整个程序的所有执行情况)

#!/bin/bash
    trap 'echo "before execute line:$LINENO, a=$a,b=$b,c=$c"' DEBUG    
    a=0
    b=2
    c=100
    while :
    do
        if ((a >= 10))
        then
            break
        fi
        let "a=a+2"
        let "b=b*2"
        let "c=c-10"
    done

运行结果如下:

演示: EXIT (一般使用这个方法来判断某一个函数是否成功执行)

#!/bin/bash
    
    func1()
    {
        echo "This is an correct function "
        var=2010
        return 0
    }
    trap 'echo "Line:$LINENO, var=$var"' EXIT #这个语句表示, 如果下边的fun1正确执行, 那么这里就显示 var=$var的值(20)
    fun1

演示: ERR

#!/bin/bash
    
    func2()
    {
        echo "This is an error function"
        var=2010
        return 1
    }
    trap 'echo "Line: $LINENO, var=$var"' ERR #这个语句表示, 如果下边的fun2是否为错误执行, 那么这里就显示 var=$var的值(20)
    func2

调试钩子

调试钩子源自于高级程序设计语言中的方法, 实际上是一个if/then结构代码块, DEBUG变量控制该代码块是否执行, 在程序开发调试阶段,
    讲DEBUG变量设置为TRUE, 使其输出调试信息, 到了程序交付使用阶段, 讲DEBUG设置为FALSE, 关闭调试钩子, 而无需一一删除调试钩子代码,
    if [ "$DEBUG" = "true" ]
    then
        echo "Debugging information"
    fi
    调试钩子中的DEBUG是一个全局变量, 在开发调试阶段, 可以利用export DEBUG=true 命令将DEBUG设置为true, 如果在每一处都需要输出调试
    信息的地方均使用if/then结构来判断DEBUG变量的值, 显的比较繁琐, 我们可以通过定义一个DEBUG函数使植入调试钩子的过程更为简洁:
    #!/bin/bash
    DEBUG()
    {
        if [ "$DEBUG" = "true" ]
        then
            $@
        fi
    }
    执行脚本前, 先 export DEBUG=true, 然后执行./脚本名

使用shell选项 (跟我之前知道几乎一样)

sh -n 脚本名 : 读取脚本中的命令, 进行语法检查, 但是并执行这些命令
    sh -x 在执行每个命令之前, 讲每个命令打印到标准输出(好用, 首选调试工具, 一般与trap的DEBUG共同使用, 这样既可以输出实际执行的每一行命令, 又
        可以逐行跟踪变量的值, 而且trap与这个-x都是在标准输出, 所以自动配合的非常好)
        -x 选项以 "+"符号作为提示符表示调试信息, 显得美中不足, 如果提示符能包含一些重要信息, 对调试更有帮助, 那么, 我们能否定制-x选项的提示符呢?
        答案是肯定的.
        LINENO 表示shell脚本的行号
        FUNCNAME 数组变量, 表示整个调用链上所有的函数名
        PS4 设置-x选项的提示符, 默认是"+"符号
        我们可以通过设置PS4, 使得-x选项提示符能包含LINENO和FUNCNAME等丰富的信息, 例如:

(下图是 sh-x 与 trap DEBUG 一起使用)

例如:

#!/bin/bash
        
        isroot()
        {
            if [ "$UID" -ne 0 ]
            then
                return 1
            else
                return 0
            fi
        }
        
        echoroot()
        {
            isroot
                if [ "$?" -ne 0 ]
                then
                    echo "I am not root user!"
                else
                    echo "root user!"
                fi
        }

export PS4='+{$LINENO:${FUNCNAME[0]}:${FUNCNAME[1]}}' #这里的PS4是, 显示本行号, 当前函数名, 调用当前函数的函数名
        exchoroot

(下图只是展示 PS4, 没有设置 trap DEBUG 功能)

16 shell调试技术的更多相关文章

  1. 【转】Linux Shell脚本调试技术

    本文转载自:https://www.ibm.com/developerworks/cn/linux/l-cn-shell-debug/ Shell脚本调试技术 本文全面系统地介绍了shell脚本调试技 ...

  2. shell脚本调试技术_转

    转自:http://itlab.idcquan.com/linux/SHELL/727128.html 参考:https://linux.cn/article-8045-1.html 本文全面系统地介 ...

  3. Shell脚本调试技术

    http://www.ibm.com/developerworks/cn/linux/l-cn-shell-debug/ 一. 前言 shell编程在unix/linux世界中使用得非常广泛,熟练掌握 ...

  4. Shell脚本的调试技术

    编程中必不可少的一点就是调试,Shell脚本以其强大的功能令人向往,当然,它的强大之处不只是体现在语言的实现功能上,更强大的是它的调试功能,下面,我将以实例讲解Shell脚本的调试技术. 下面是我所用 ...

  5. [转载]Android开发常用调试技术记录

    ANDROID 调试技术: 1)Ps 指令 ls –l /proc/27/ cat /proc/27/cmdline       #cmdline文件表示了这个进程所在的命令行. cat /proc/ ...

  6. (转)shell调试方法

    ---恢复内容开始--- 转载:https://www.ibm.com/developerworks/cn/linux/l-cn-shell-debug/ Shell脚本调试技术 曹 羽中2007 年 ...

  7. 掌握 Linux 调试技术

    掌握 Linux 调试技术 在 Linux 上找出并解决程序错误的主要方法 Steve Best (sbest@us.ibm.com)JFS 核心小组成员,IBM 简介: 您可以用各种方法来监控运行着 ...

  8. iOS 开发者旅途中的指南针 - LLDB 调试技术

    文章转载于:iOS 开发者旅途中的指南针 - LLDB 调试技术 今天给大家介绍的内容,无关乎任何功能性开发技术,但又对开发的效率影响至深,这就是调试技术. 何为调试呢,比如我们用 print 函数在 ...

  9. Linux kprobe调试技术使用

    kprobe调试技术是为了便于跟踪内核函数执行状态所设计的一种轻量级内核调试技术. 利用kprobe技术,可以在内核绝大多数函数中动态插入探测点,收集调试状态所需信息而基本不影响原有执行流程. kpr ...

随机推荐

  1. php socket函数详解

    最近在用socket实现服务端向客户端主动推送消息 函数名 描述 socket_accept() 接受一个Socket连接 socket_bind() 把socket绑定在一个IP地址和端口上 soc ...

  2. java生成验证码的逻辑

    直接撸代码: 1.html <input class="form-control placeholder-no-fix width-yzm" type="text& ...

  3. Winform知识点

    Winform窗体常用的控件 1.按钮 Button 前缀:btn 2.文本框 TextBox 前缀:txt 3.单选按钮 RadioButton 前缀:rdo 4.复选按钮 CheckBox 前缀: ...

  4. MVC模式:实现数据库中数据的增删改查功能

    *.数据库连接池c3p0,连接mysql数据库: *.Jquery使用,删除时跳出框,确定是否要删除: *.使用EL和JSTL,简化在jsp页面中插入的java语言 1.连接数据库 (1)导入连接数据 ...

  5. Andriod 按钮代码

    package com.example.test1; import android.support.v7.app.ActionBarActivity; import android.os.Bundle ...

  6. InheritableThreadLocal原理

    转载:https://github.com/pzxwhc/MineKnowContainer/issues/20 介绍 InheritableThreadLocal 之前,假设对 ThreadLoca ...

  7. [Django_1_1]第一个app

    Django 第一个app 本篇负责介绍添加第一个Django app. 本篇文章的上一篇为:Django 初次见面 关于App和Project 简单的来说,一个项目(Project)可以由很多个应用 ...

  8. Sql Server 2008完全卸载方法(其他版本类似)

    一.    SQL2008卸载. 1.从控制面板卸载 1)点击计算机右下角“开始”,点击“控制面板” 2)点击“卸载程序”. 3)在程序列表中找到“Microsoft SQL Server 2008” ...

  9. 2016年11月7日 星期一 --出埃及记 Exodus 19:23

    2016年11月7日 星期一 --出埃及记 Exodus 19:23 Moses said to the LORD, "The people cannot come up Mount Sin ...

  10. 批量清除.svn 或 _svn

    Windows Registry Editor Version 5.00[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\DeleteSVN]@=&q ...