在看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 编译安装
tar -zxvf bashdb-4.4-0.94.tar.gz
cd bashdb-4.4-0.94/
./configure
make && make check
$make install
1.3 调试
省略
2. bash -x
以 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脚本输出调试信息前有一个+,而被调用的脚本调试信息++,这样就能区分层级和调用关系
3. set -x
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放在了主控脚本开头的位置,所以调试只输出了主控脚本的调试信息,被调脚本的调试信息没有输出。这样我们就能很灵活根据实际出问题的地方添加调试,避免过多调试信息的干扰。