对于厌烦了的 print 和 echo,可以尝试点新鲜省力的小手段。

1. 使用 shell 的执行选项

sh 和 bash 常用的执行指令有:-n、-x、-c、-v。

其中:

-n 是 noexec 的简写,作用是只做脚本的语法检查,而不执行脚本。

-x 是 xtrace 的简写,作用是在每一行代码执行之前,将代码本身打印到标准输出(代码前添加一个 “+” 用来区别)。这个在调试的时候尤其有用。

-c 是 command string 的缩写,使用该选项从字符串而不是文件读取脚本。比如,sh -c 'a=1;b=2;let c=$a+$b;echo "c=$c"'。

-v 是 verbose 的缩写,用来显示所有读入的标准输入。

这些选项除了在启动脚本时指定外,我们还可以在脚本中,使用 set 来设置。比如,在脚本中,我们可以用 set 来打开和关闭 xstrace:

  1. set -x    #启动"-x"选项
  2. 要跟踪的程序段
  3. set +x     #关闭"-x"选项

2. 用 trap 设置调试陷阱

trap 是可以接收指定的 SIGNAL ,然后,执行设定的脚本。除了我们使用 kill -l 罗列的那些 SIGNAL,还有三个虚拟的 SIGNAL:EXIT,ERR,DEBUG。前两个不必说,第三个是每执行一条指令都会发出的。。。所以,我们可以借助 DEBUG 来跟踪变量。如下,我们可以在脚本中添加这么一行代码:

  1. trap 'echo "line:$LINENO, a=$a"' DEBUG

然后,脚本每执行一行,都会打印相应行号,以及 a 的值。。。当然,除了变量 a ,你可以随意指定要要追中的变量。比如,下面这个例子:

  1. #!/bin/bash
  2.  
  3. trap 'echo "line:$LINENO, str=$str, str1=$str1"' DEBUG
  4.  
  5. str="abcdefg"
  6.  
  7. str1=$(expr substr "$str" )
  8.  
  9. echo $str1
  10.  
  11. if [ $str1 == "abc" ] ;then
  12. echo "nice"
  13. fi

执行的结果如下:

  1. line:, str=, str1=
  2. line:, str=abcdefg, str1=
  3. line:, str=abcdefg, str1=abc
  4. abc
  5. line:, str=abcdefg, str1=abc
  6. line:, str=abcdefg, str1=abc
  7. nice

主意,因为这里只有 5、7、9 、11、12 这几行有代码,所以~

3. 用 tee 来调试管道

有时候我们需要调试管道。。。比如下面这条,套了好几层,也不知道谁对谁错。。。一条条的试?好像也比较麻烦。

tee 的作用呢,是当标准输入有数据时,把数据转到标准输出的同时,把数据写到某文件中。比如:

  1. ipaddr=`/sbin/ifconfig | grep 'inet addr:' | grep -v '127.0.0.1'
  2. | tee temp.txt | cut -d : -f3 | awk '{print $1}'`
  3. echo $ipaddr

tee 这一段,完全就是为了查看中间输出了什么。。。执行完这一句,在当前目录多了一个 temp.txt 的文件,内容是:

  1. $ cat temp.txt
  2. inet addr:192.168.0.1 Bcast:192.168.0.255 Mask:255.255.255.0

so...

4. 使用调试钩子

这个完全就是用普通代码完成的小技巧,相信其他语言编程的时候,这样的代码也常用的。在 shell 中实现出来大概是这样的:

  1. if [ $DEBUG = true ]; then
  2. echo debugging #此处可以输出调试信息
  3. fi

用这段代码,我们可以方便的用一个名为 DEBUG 的变量控制是否输出调试信息;设置 'export DEBUG=true' 就可以打开调试输出。或者,我们可以定一个 DEBUG 函数:

  1. DEBUG()
  2. {
  3. if [ "$DEBUG" = "true" ]; then
  4. $@  
  5. fi
  6. }
  7.  
  8. a=
  9. DEBUG echo "a=$a"
  10.  
  11. if [ "$a" -eq ] ;then
  12. b=
  13. else
  14. b=
  15. fi
  16.  
  17. DEBUG echo "b=$b"
  18. c=
  19. DEBUG echo "c=$c"

发布的时候,记得把调试开关关了,留着代码,也没多大影响。

shell 调试手段总结的更多相关文章

  1. shell调试选项

    [shell调试选项] 一些常用选项的用法: -n 只读取shell脚本,但不实际执行 -x 进入跟踪方式,显示所执行的每一条命令 -c "string" 从strings中读取命 ...

  2. PCI 设备调试手段

    Author: Younix Platform: RK3399 OS: Android 6.0 Kernel: 4.4 Version: v2017.04 一PCI 设备调试手段 busybox ls ...

  3. (转)shell调试方法

    ---恢复内容开始--- 转载:https://www.ibm.com/developerworks/cn/linux/l-cn-shell-debug/ Shell脚本调试技术 曹 羽中2007 年 ...

  4. 解析使用ThinkPHP应该掌握的调试手段

    解析使用ThinkPHP应该掌握的调试手段     使用ThinkPHP应该掌握的调试手段经常看到有人问到findAll的返回数据类型是什么之类的问题,以及出错了不知道什么原因的情况,其实还是没有熟悉 ...

  5. 单片机裸机下写一个自己的shell调试器(转)

    源: 单片机裸机下写一个自己的shell调试器

  6. thinkphp调试手段

    使用ThinkPHP应该掌握的调试手段经常看到有人问到findAll的返回数据类型是什么之类的问题,以及出错了不知道什么原因的情况,其实还是没有熟悉ThinkPHP内置的调试手段和方法,抛开IDE本身 ...

  7. 安卓开发,adb shell 调试sqlite3数据库

    安卓开发,adb shell 调试sqlite3数据库 在安卓中创建了sqlite3数据库,想要调试怎么办? 通过adb shell来进行查看. 第一步,将adb加入到系统变量中. 这样就可以在命令行 ...

  8. 总结一篇shell调试技巧及常见的脚本错误

      #常见的调试命令工具 1.使用bash命令参数调试 #使用 [root@game ~]# sh [-xvn] test.sh #参数解释: -x:将执行的脚本内容输出出来,可以看到执行的过程 -n ...

  9. 程序调试手段之gdb, vxworks shell

    调试一个程序主要用到的功能: 启动程序 设置函数断点 设置数据断点 单步执行 查看内存值 修改内存值 linux下的gdb,和vxworks下的shell 虽然使用方式和调试命令略有不同,但是都能满足 ...

随机推荐

  1. 柯里化/偏函数/Curring用法

    把接受多个参数的函数变成一个单一参数的函数,并且返回接受余下的参数而有返回结果的新函数的技术 下面我们以实例说明: var toString = {}.toString; var isString = ...

  2. [MetaHook] GameUI hook

    Hook GameUI function. #include <metahook.h> #include <IGameUI.h> IGameUI *g_pGameUI = ; ...

  3. 求解最大正方形面积 — leetcode 221. Maximal Square

    本来也想像园友一样,写一篇总结告别 2015,或者说告别即将过去的羊年,但是过去一年发生的事情,实在是出乎平常人的想象,也不具有代表性,于是计划在今年 6 月份写一篇 "半年总结" ...

  4. Web Worker 是什么鬼?

    前言 前端工程师们一定有过这样的体验,当一个页面加载了大量的 js 文件时,用户界面可能会短暂地"冻结".这很好理解,因为 js 是单线程的语言.我们再走的极端点,一段 js 中出 ...

  5. NVIC优先级分组

    挂起,解挂,使能,失能

  6. JavaScript学习笔记-商品管理新增/删除/修改功能

    <!DOCTYPE html> <html lang="en" xmlns="http://www.w3.org/1999/xhtml"> ...

  7. /var/spool/clientmqueue 下生成太多文件处理

    问题现象: linux操作系统中的/var/spool/clientmqueue/目录下存在大量文件. 原因分析: 系统中有用户开启了cron,而cron中执行的程序有输出内容,输出内容会以邮件形式发 ...

  8. Python基础-字符串格式化_百分号方式_format方式

    Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...

  9. 使用delegate实现简单的查询功能

    protected void imgbtnSearch_Click(object sender, System.Web.UI.ImageClickEventArgs e) { string keyWo ...

  10. 安卓activity生命周期

    相信不少朋友也已经看过这个流程图了,也基本了解了Activity生命周期的几个过程,我们就来说一说这几个过程. 1.启动Activity:系统会先调用onCreate方法,然后调用onStart方法, ...