LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1328|回复: 2

shell DEBUG

[复制链接]
发表于 2007-11-21 09:39:10 | 显示全部楼层 |阅读模式
首先先给一个链接,这个链接里对DEBUG已经将的很详细了。
http://www.ibm.com/developerwork ... ll-debug/index.html

根据以上的教程,我再修改了部分内容。下面代码是我写的示例,仔细分析下肯定能对shell DEBUG有所提高的。
  1. #!/bin/bash
  2. # author: adamzyg
  3. # encoding: UTF-8
  4. # date: 2007/11/20
  5. # 使用trap命令
  6. # trap 'command' signal
  7. # trap用于捕获指定的信号并执行相应的命令
  8. # 其中signal是要捕获的信号, command是捕获到指定的信号之后所要执行的命令. kill -l会列出在系统中定义的所有信号.
  9. # 捕获信号后可以是命令或多条shell语句,也可以是一个函数名.
  10. # shell在执行时会产生三个伪信号(之所以是伪信号,是因为其他信号由操作系统产生,这三个是由shell产生)
  11. # ### shell 伪信号 ###
  12. # 信号名                                                何时产生
  13. # EXIT                                                        从一个函数中退出或一个脚本执行完毕
  14. # ERR                                                        当一条命令返回非零状态时(命令执行不成功)
  15. # DEBUG                                                        脚本中每一条命令执行之前
  16. #
  17. # 使用调试钩子.调试钩子实质上是自己定义的一个变量,如果这个变量为真,就会把调试信息作为参数传给某个定义的函数
  18. # 然后在这个函数中执行此调试信息
  19. #
  20. PS4='+[$LINENO:${FUNCNAME:-`basename $0`}] '        # 我们可以把它export在.bash_profile里
  21. ADAMZYGDEBUG="true"                        # true will start debug
  22. myDEBUG()
  23. {
  24.         if [[ "$ADAMZYGDEBUG" = "true" ]]; then
  25.                 $@
  26.         fi
  27. }
  28. a=0; b=0; c=0
  29. ERRTRAP()
  30. {
  31.         echo "[LINE: $1] Error: Command or function exited with status $?"
  32. }
  33. func1()
  34. {
  35.         a=1
  36.         myDEBUG echo "Enter into $FUNCNAME"
  37.         func2
  38.         myDEBUG echo "Out of $FUNCNAME"
  39. }
  40. func2()
  41. {
  42.         b=1
  43.         myDEBUG echo "Enter into $FUNCNAME"
  44.         echo "In $FUNCNAME do nothing."
  45.         myDEBUG echo "Out of $FUNCNAME"
  46. }
  47. trap 'ERRTRAP $LINENO' ERR
  48. trap 'echo "before execute line:$LINENO a=$a b=$b c=$c"' DEBUG
  49. abc
  50. func1
  51. trap '' DEBUG                                # stop the trap for the DEBUG signal
  52. c=1
  53. myDEBUG set -x                                # 这一句执行完之前没有打开跟踪,因此肯定不会看到进入myDEBUG的执行过程
  54. ((a=a+1))
  55. ((b=b+1))
  56. func1
  57. myDEBUG set +x                                # 这一句执行完之前跟踪还处于打开状态,因此连myDEBUG里的过程都会打印出来
  58. exit 0
  59. # 以上debug的方式都打开的话,DEBUG的信息忒详细,甚至都有点感觉乱乱的,因此选择合适的DEBUG方法就显得挺重要的.^_^
复制代码

在使用"set -x"调试脚本时,我觉得使用我写的PS4
  1. PS4='+[$LINENO:${FUNCNAME:-`basename $0`}] '
复制代码
会很方便。
发表于 2007-11-21 14:27:54 | 显示全部楼层
泼个冷水

楼主心态不正
在论坛里混就是为了相互提高
如果是为了追求以精华帖示人
那就没意思了
坛里帖子上千万
精华并不只在精华帖中
没有人会稀罕那些所谓的精华帖
也不见得"有些技术含量"的就是受欢迎的

还是以通过交流,帮助别人的同时提高自己的水平为好
回复 支持 反对

使用道具 举报

发表于 2007-11-22 10:24:52 | 显示全部楼层
感觉要在这个区加精挺难的...
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表