• 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放在了主控脚本开头的位置,所以调试只输出了主控脚本的调试信息,被调脚本的调试信息没有输出。这样我们就能很灵活根据实际出问题的地方添加调试,避免过多调试信息的干扰。

  • 相关阅读:
    选择供应商服务系统,是大健康产业企业迈向数字化转型的第一步
    大模型能力
    职场必备两款高效率管理工具,大有用处!
    预处理加速干货:大幅加速数据预处理、轻松定制高性能ML算子
    SQL:sql连接那些事儿
    @Mock @MockBean @InjectMocks之间的关系
    通讯协议学习之路:QSPI协议理论
    Go 实现插入排序算法及优化
    云计算-Linux-VMware安装Centos
    MySQL数据库之进阶查询语句
  • 原文地址:https://blog.csdn.net/hsy12342611/article/details/128154575