|
首先先给一个链接,这个链接里对DEBUG已经将的很详细了。
http://www.ibm.com/developerwork ... ll-debug/index.html
根据以上的教程,我再修改了部分内容。下面代码是我写的示例,仔细分析下肯定能对shell DEBUG有所提高的。- #!/bin/bash
- # author: adamzyg
- # encoding: UTF-8
- # date: 2007/11/20
- # 使用trap命令
- # trap 'command' signal
- # trap用于捕获指定的信号并执行相应的命令
- # 其中signal是要捕获的信号, command是捕获到指定的信号之后所要执行的命令. kill -l会列出在系统中定义的所有信号.
- # 捕获信号后可以是命令或多条shell语句,也可以是一个函数名.
- # shell在执行时会产生三个伪信号(之所以是伪信号,是因为其他信号由操作系统产生,这三个是由shell产生)
- # ### shell 伪信号 ###
- # 信号名 何时产生
- # EXIT 从一个函数中退出或一个脚本执行完毕
- # ERR 当一条命令返回非零状态时(命令执行不成功)
- # DEBUG 脚本中每一条命令执行之前
- #
- # 使用调试钩子.调试钩子实质上是自己定义的一个变量,如果这个变量为真,就会把调试信息作为参数传给某个定义的函数
- # 然后在这个函数中执行此调试信息
- #
- PS4='+[$LINENO:${FUNCNAME:-`basename $0`}] ' # 我们可以把它export在.bash_profile里
- ADAMZYGDEBUG="true" # true will start debug
- myDEBUG()
- {
- if [[ "$ADAMZYGDEBUG" = "true" ]]; then
- $@
- fi
- }
- a=0; b=0; c=0
- ERRTRAP()
- {
- echo "[LINE: $1] Error: Command or function exited with status $?"
- }
- func1()
- {
- a=1
- myDEBUG echo "Enter into $FUNCNAME"
- func2
- myDEBUG echo "Out of $FUNCNAME"
- }
- func2()
- {
- b=1
- myDEBUG echo "Enter into $FUNCNAME"
- echo "In $FUNCNAME do nothing."
- myDEBUG echo "Out of $FUNCNAME"
- }
- trap 'ERRTRAP $LINENO' ERR
- trap 'echo "before execute line:$LINENO a=$a b=$b c=$c"' DEBUG
- abc
- func1
- trap '' DEBUG # stop the trap for the DEBUG signal
- c=1
- myDEBUG set -x # 这一句执行完之前没有打开跟踪,因此肯定不会看到进入myDEBUG的执行过程
- ((a=a+1))
- ((b=b+1))
- func1
- myDEBUG set +x # 这一句执行完之前跟踪还处于打开状态,因此连myDEBUG里的过程都会打印出来
- exit 0
- # 以上debug的方式都打开的话,DEBUG的信息忒详细,甚至都有点感觉乱乱的,因此选择合适的DEBUG方法就显得挺重要的.^_^
复制代码
在使用"set -x"调试脚本时,我觉得使用我写的PS4- PS4='+[$LINENO:${FUNCNAME:-`basename $0`}] '
复制代码 会很方便。 |
|