在看nginx源码实现时发现有些代码是根据不同的本地环境动态生成的,看了一下大致生成流程,基本上都是通过shell脚本调用shell脚本实现的。看到了shell脚本,就想到如何调试shell脚本,shell脚本在实际工作中运用的挺多的,所以就将shell脚本的调试方法进行总结,shell程序有很多中,本篇文章将总结bash脚本的调试。
1.1 bash debugger安装
首先查看本地bash版本,然后从如下地址下载对应ash debugger源码
bash debugger - Browse /bashdb at SourceForge.net
比如本人机器bash版本如下,就下载4.4的源码
1.2 编译安装
- tar -zxvf bashdb-4.4-0.94.tar.gz
-
- cd bashdb-4.4-0.94/
- ./configure
-
- make && make check
-
- $make install
1.3 调试
省略
以 bash -x 脚本名的方式运行脚本就能看到调试信息
调试举例:
有如下三个shell脚本,tesh.sh, init,define,目录结构如下
test.sh脚本调用init脚本和define脚本,init脚本用来初始化全局变量,define脚本用来定义.h文件生成模板
int内容如下:
- MAKE_FILE=Makefile
- AUTO_ENV_H=auto_env.h
- FUN_OBJS=subdir
define内容如下:
-
- # Copyright (C) Test Shell
- # Copyright (C) Test, Inc.
-
-
- cat << END > $AUTO_ENV_H
- #ifndef $have
- #define $have $value
- #endif
- END
test.sh内容如下:
- #!/bin/bash
-
- #测试调试
- uname -s
- uname -r
- uname -m
- read num1
- read num2
- let num=$num1+$num2
-
- #初始化变量
- . ./init
-
- #变量赋值,执行替换
- have=NGX_ALIGNMENT value=16 . define
-
- #echo $num
- cat << END > ${MAKE_FILE}
-
- install_perl_modules:
- cd $NGX_OBJS/src/http/modules/perl && \$(MAKE) install
- END
-
-
bash -x test.sh运行结果显示如下:
脚本生成了两个文件Makefile和auto_env.h
内容分别如下:
-
- install_perl_modules:
- cd /src/http/modules/perl && $(MAKE) install
-
- #ifndef NGX_ALIGNMENT
- #define NGX_ALIGNMENT 16
- #endif
-
通过运行结果看,test.sh脚本输出调试信息前有一个+,而被调用的脚本调试信息++,这样就能区分层级和调用关系
set -x调试与bash -x调试方式类似,只不过该方式更加灵活,配合set +x只在脚本局部进行调试输出
调试举例:
test.sh脚本内容如下:
- #!/bin/bash
-
- #测试调试
- set -x
- uname -s
- uname -r
- uname -m
- read num1
- read num2
- let num=$num1+$num2
- set +x
-
- #初始化变量
- . ./init
-
- #变量赋值,执行替换
- have=NGX_ALIGNMENT value=16 . define
-
- #echo $num
- cat << END > ${MAKE_FILE}
-
- install_perl_modules:
- cd $NGX_OBJS/src/http/modules/perl && \$(MAKE) install
- END
-
-
执行脚本:bash test.sh
运行结果如下:
由于我将set -x 和set +x放在了主控脚本开头的位置,所以调试只输出了主控脚本的调试信息,被调脚本的调试信息没有输出。这样我们就能很灵活根据实际出问题的地方添加调试,避免过多调试信息的干扰。