• bash调试方法总结


      在看nginx源码实现时发现有些代码是根据不同的本地环境动态生成的,看了一下大致生成流程,基本上都是通过shell脚本调用shell脚本实现的。看到了shell脚本,就想到如何调试shell脚本,shell脚本在实际工作中运用的挺多的,所以就将shell脚本的调试方法进行总结,shell程序有很多中,本篇文章将总结bash脚本的调试。

    1. bash debugger

    1.1 bash debugger安装

    首先查看本地bash版本,然后从如下地址下载对应ash debugger源码

    bash debugger - Browse /bashdb at SourceForge.net

    比如本人机器bash版本如下,就下载4.4的源码

    1.2 编译安装

    1. tar -zxvf bashdb-4.4-0.94.tar.gz 
    2. cd bashdb-4.4-0.94/
    3. ./configure
    4. make && make check
    5. $make install

    1.3 调试

    省略

    2. bash -x

    以 bash -x  脚本名的方式运行脚本就能看到调试信息

    调试举例:

    有如下三个shell脚本,tesh.sh, init,define,目录结构如下

     test.sh脚本调用init脚本和define脚本,init脚本用来初始化全局变量,define脚本用来定义.h文件生成模板

    int内容如下:
     

    1. MAKE_FILE=Makefile
    2. AUTO_ENV_H=auto_env.h
    3. FUN_OBJS=subdir

    define内容如下:

    1. # Copyright (C) Test Shell
    2. # Copyright (C) Test, Inc.
    3. cat << END > $AUTO_ENV_H
    4. #ifndef $have
    5. #define $have $value
    6. #endif
    7. END

    test.sh内容如下:

    1. #!/bin/bash
    2. #测试调试
    3. uname -s
    4. uname -r
    5. uname -m
    6. read num1
    7. read num2
    8. let num=$num1+$num2
    9. #初始化变量
    10. . ./init
    11. #变量赋值,执行替换
    12. have=NGX_ALIGNMENT value=16 . define
    13. #echo $num
    14. cat << END > ${MAKE_FILE}
    15. install_perl_modules:
    16. cd $NGX_OBJS/src/http/modules/perl && \$(MAKE) install
    17. END

    bash -x test.sh运行结果显示如下:

    脚本生成了两个文件Makefile和auto_env.h

    内容分别如下:

    1. install_perl_modules:
    2. cd /src/http/modules/perl && $(MAKE) install
    1. #ifndef NGX_ALIGNMENT
    2. #define NGX_ALIGNMENT 16
    3. #endif

     通过运行结果看,test.sh脚本输出调试信息前有一个+,而被调用的脚本调试信息++,这样就能区分层级和调用关系

    3. set -x

    set -x调试与bash -x调试方式类似,只不过该方式更加灵活,配合set +x只在脚本局部进行调试输出

    调试举例:

    test.sh脚本内容如下:

    1. #!/bin/bash
    2. #测试调试
    3. set -x
    4. uname -s
    5. uname -r
    6. uname -m
    7. read num1
    8. read num2
    9. let num=$num1+$num2
    10. set +x
    11. #初始化变量
    12. . ./init
    13. #变量赋值,执行替换
    14. have=NGX_ALIGNMENT value=16 . define
    15. #echo $num
    16. cat << END > ${MAKE_FILE}
    17. install_perl_modules:
    18. cd $NGX_OBJS/src/http/modules/perl && \$(MAKE) install
    19. END

    执行脚本:bash test.sh 

    运行结果如下:

    由于我将set -x 和set +x放在了主控脚本开头的位置,所以调试只输出了主控脚本的调试信息,被调脚本的调试信息没有输出。这样我们就能很灵活根据实际出问题的地方添加调试,避免过多调试信息的干扰。

  • 相关阅读:
    Pipeline aggregations管道聚合- parent-2
    想要精通算法和SQL的成长之路 - 最长连续序列
    动力环境监控是什么?动力环境监控系统包括哪些设备
    Spark-Core
    8位微控制器上的轻量级SM2加密算法实现:C语言详细指南与完整代码解析
    MySQL索引常见面试题(2022版)
    力扣--深度优先算法/回溯算法77.组合
    解决tomcat8.5.37控制台中文乱码问题
    插入单列列给单列添加数据
    使用 Postman 工具高效管理和测试 SAP ABAP OData 服务的试读版
  • 原文地址:https://blog.csdn.net/hsy12342611/article/details/128154575