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 编译安装

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: "exec bash"是一个命令,它会在当前 shell 中执行一个新的 bash shell。这个命令可以用来替换当前 shell 进程,以便在一个新的 bash 环境中执行命令,或者在需要重新启动 shell 时快速完成此操作。 ### 回答2: exec bash是一个shell命令,用于在当前的shell环境中执行一个新的bash子进程,并将控制权交给这个子进程。 当我们在命令行中输入exec bash时,实际上是在启动一个新的bash子进程,并将子进程的输入、输出和错误流指向当前的shell进程。这意味着,执行exec bash后,当前的shell进程会被替换为一个新的bash进程,并且原来的环境变量、别名以及shell参数等都会被清除,只保留新的bash环境。 exec bash的主要作用是刷新当前的shell环境,重新加载bash的配置文件(例如~/.bashrc)和环境变量,以使得新的配置信息和环境变量生效。同时,也可以通过exec bash来启动一个新的bash会话,用于临时执行一些命令或脚本。 需要注意的是,执行exec bash后,原来的shell进程的任何操作都会终止,因此在执行该命令之前,应确保已保存当前工作的进度和数据。另外,如果在exec bash命令后还有其他命令,那么这些命令将不会被执行,因为控制权已经完全交给了新的bash子进程。 总结来说,exec bash命令的含义是启动一个新的bash子进程,刷新当前的shell环境并替换为新的bash进程,以便加载新的配置信息和环境变量,并临时执行一些命令或脚本。 ### 回答3: exec bash 是一个命令,用于执行一个新的bash shell,取代当前的shell。当我们在终端中键入exec bash命令,它会创建一个全新的子shell,并将当前的shell替换为子shell。这意味着在执行exec bash后,我们将进入一个全新的bash环境,此操作对于调试和修改当前shell环境非常有用。 使用exec bash的主要好处之一是它可以重置当前shell的环境变量和配置。在某些情况下,我们可能会更改环境变量或shell配置文件(如.bashrc),并希望立即生效。通过执行exec bash,我们可以使之生效,而不必注销并重新登录。 另一个使用exec bash的典型场景是在脚本中执行该命令。当脚本需要在不影响当前shell环境的情况下创建一个子shell时,可以使用exec bash命令。这对于脚本的模块化和隔离非常有用,因为子shell中的任何变量和配置更改都不会影响到父shell。 但需要注意的是,当执行exec bash时,当前shell的状态将被丢弃,包括已经创建的所有变量和配置。因此,在使用这个命令之前,我们应该确保已经保存了需要保留的任何重要信息。 总之,exec bash是一个用于执行新bash shell的命令,它提供了一种快速方便的方法来重置当前shell的环境、调试和在脚本中创建子shell。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值