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

  • 相关阅读:
    MyCat简介与安装
    AutoDev 自定义 Agent:快速接入内部 AI Agent,构建 IDE 即 AI 辅助研发中心
    算法之路(二)
    PowerManagerService启动-Android12
    python之数据类型转换
    《论文阅读》监督对抗性对比学习在对话中的情绪识别 ACL2023
    GitHub项目管理详细教程/git教程【有图有代码】
    HTML5--全局属性--事件
    景联文科技:针对敏感数据的安全转录服务,护航信息安全
    ucore实验二
  • 原文地址:https://blog.csdn.net/hsy12342611/article/details/128154575