免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3758 | 回复: 9
打印 上一主题 下一主题

[原创】简单、有效的脚本跟踪、调试技巧 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-01-16 20:51 |只看该作者 |倒序浏览
呵呵,发点不一样的。首发:http://www.opensolution.org.cn/archives/381.html

这两天在研究grub,发现grub-install其实是个shell脚本,就想深入看看这个脚本到底是怎么运行的,在追踪脚本运行的时候,组合了几个平常学到的小技巧。虽然每个小技巧本身没什么,但组合起来,感觉给脚本追踪、调试提供了不少便利,因此share出来。



1. 如何看到具体的执行过程?
这个简单,使用sh –x,使用-x参数能看到脚本的具体执行过程,这个相信大家都会,不赘述。

2. 如何将执行的过程完整的保存到一个文件内供反复参看
  • 当脚本执行完后,如果我们想再次看到刚才的执行过程。我们经常会使用两种方法.
  • 通过>或者>>将输出重定向到一个文件,如sh –x gurb-install >grub.log ,但这个有不便之处,脚本的输出分为正确(文件句柄1)和错误(文件句柄2)的,如果需要将错误的和正确的都定向到一个文件,需要使用类似如下形式,sh –x gurb-install >grub.log 2>&1,麻烦,而且就我个人来说,老记不住2>&1。
  • 如果在secureCRT等终端下,可通过滚动条上下翻看。但这个如果整个执行过程比较长或者后面又执行了命令之后,翻看就不是很方便
  • 该亮出我们的独门武器了—script,在执行脚本前先执行一下script命令,脚本执行的所有输出都会保存在当前目录下一个文件中,文件名默认是typescript,当然在调用script命令时也可指定一下文件名,偶一般是不指定。用script的特点是:所有输出到终端的内容都会存入typescript文件,不管是错误信息还是正确信息.

3. 显示行号
用vi打开脚本,并用set nu启用行号。同时把以下的代码加入原脚本的#! /bin/sh之后,真正执行的脚本之前,让执行的过程也显示行号,对照着看,就会省时省力。

  trap 'echo "before execute lineLINENO" >/dev/null' DEBUG
以下具体示例:





  ++ echo 'before execute line:44'
  + justcopy=no
  ++ echo 'before execute line:47'
  + test -x /bin/tempfile
  ++ echo 'before execute line:50'
  + test -x /bin/mktemp
  ++ echo 'before execute line:51'
  + mklog='/bin/mktemp /tmp/grub-install.log.XXXXXX'
  ++ echo 'before execute line:52'
  + mkimg='/bin/mktemp /tmp/grub-install.img.XXXXXX'
  + for option in '"$@"'
  ++ echo 'before execute line:242'
  + case "$option" in
  ++ echo 'before execute line:243'
  • 从以上我们可以轻松看出脚本执行了那几行语句。  
  • 很容易看出47行的if判断返回值是false,所以48、49没执行,50的if判断是true,所以51、52行执行了,一目了然。  
  • 看到执行完52之后,就跳到了242行,如果不是有行号显示,很难直接判断出如此大的跳跃

4. 提示行和脚本行混在一起,可不可以看得更清楚一些呢?
所有以++开头的都是提示行,所有已+开头的都是脚本行,通过vim对查找功能的highlight,可以轻松实现

以下为图例:





我们通过对++进行查找,就让执行过程的提示行的++都以黄色高亮显示了,怎么样?看着更舒服了吧?

5. 百尺竿头,更进一步
如果你用vim -O2 /sbin/grub-install typescript命令打开的双垂直窗口,左边是脚本,右边是脚本执行步骤,那效果就绝对好了。这种方式在同一个界面中参看,更直观的可以看到脚本和脚本执行之间的关系。(TIPS:1、使用CTRL-w-w开关进行两个窗口的切换。2、在使用wq、q!命令退出窗口时,记得在q后面加上a,可以一次同时退出所有窗口)


[ 本帖最后由 ops 于 2009-1-16 20:52 编辑 ]

评分

参与人数 1可用积分 +10 收起 理由
寂寞烈火 + 10 加分鼓励

查看全部评分

论坛徽章:
0
2 [报告]
发表于 2009-01-16 20:54 |只看该作者
不错,好东东,收藏

论坛徽章:
0
3 [报告]
发表于 2009-01-16 21:03 |只看该作者
记得 DW上好像也有篇有关SHELL调试的,也很不错,大家可以到DW的站点上搜一下,呵呵

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
4 [报告]
发表于 2009-01-17 15:54 |只看该作者
支持原创,加分鼓励!

论坛徽章:
3
戌狗
日期:2014-09-10 17:07:162015年辞旧岁徽章
日期:2015-03-03 16:54:15wusuopu
日期:2016-06-17 17:43:45
5 [报告]
发表于 2009-01-17 16:23 |只看该作者
好文,值得一看

论坛徽章:
0
6 [报告]
发表于 2009-01-17 16:52 |只看该作者
写 SHELL 脚本还没怎么用 debug,学习了

论坛徽章:
0
7 [报告]
发表于 2009-01-19 09:14 |只看该作者
DEBUG是什么信号?

论坛徽章:
0
8 [报告]
发表于 2009-01-19 09:21 |只看该作者
写的非常好,学习了

论坛徽章:
0
9 [报告]
发表于 2009-01-19 09:23 |只看该作者

回复 #7 smallstar001 的帖子

为什么会这样问,debug是指调试信息吧。

论坛徽章:
0
10 [报告]
发表于 2009-02-19 11:42 |只看该作者
好,顶一个,问一下,如何实现++的黄色高亮显示?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP