shell 调试手段总结
对于厌烦了的 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:
set -x #启动"-x"选项
要跟踪的程序段
set +x #关闭"-x"选项
2. 用 trap 设置调试陷阱
trap 是可以接收指定的 SIGNAL ,然后,执行设定的脚本。除了我们使用 kill -l 罗列的那些 SIGNAL,还有三个虚拟的 SIGNAL:EXIT,ERR,DEBUG。前两个不必说,第三个是每执行一条指令都会发出的。。。所以,我们可以借助 DEBUG 来跟踪变量。如下,我们可以在脚本中添加这么一行代码:
trap 'echo "line:$LINENO, a=$a"' DEBUG
然后,脚本每执行一行,都会打印相应行号,以及 a 的值。。。当然,除了变量 a ,你可以随意指定要要追中的变量。比如,下面这个例子:
#!/bin/bash trap 'echo "line:$LINENO, str=$str, str1=$str1"' DEBUG str="abcdefg" str1=$(expr substr "$str" ) echo $str1 if [ $str1 == "abc" ] ;then
echo "nice"
fi
执行的结果如下:
line:, str=, str1=
line:, str=abcdefg, str1=
line:, str=abcdefg, str1=abc
abc
line:, str=abcdefg, str1=abc
line:, str=abcdefg, str1=abc
nice
主意,因为这里只有 5、7、9 、11、12 这几行有代码,所以~
3. 用 tee 来调试管道
有时候我们需要调试管道。。。比如下面这条,套了好几层,也不知道谁对谁错。。。一条条的试?好像也比较麻烦。
tee 的作用呢,是当标准输入有数据时,把数据转到标准输出的同时,把数据写到某文件中。比如:
ipaddr=`/sbin/ifconfig | grep 'inet addr:' | grep -v '127.0.0.1'
| tee temp.txt | cut -d : -f3 | awk '{print $1}'`
echo $ipaddr
tee 这一段,完全就是为了查看中间输出了什么。。。执行完这一句,在当前目录多了一个 temp.txt 的文件,内容是:
$ cat temp.txt
inet addr:192.168.0.1 Bcast:192.168.0.255 Mask:255.255.255.0
so...
4. 使用调试钩子
这个完全就是用普通代码完成的小技巧,相信其他语言编程的时候,这样的代码也常用的。在 shell 中实现出来大概是这样的:
if [ “$DEBUG” = “true” ]; then
echo “debugging” #此处可以输出调试信息
fi
用这段代码,我们可以方便的用一个名为 DEBUG 的变量控制是否输出调试信息;设置 'export DEBUG=true' 就可以打开调试输出。或者,我们可以定一个 DEBUG 函数:
DEBUG()
{
if [ "$DEBUG" = "true" ]; then
$@
fi
} a=
DEBUG echo "a=$a" if [ "$a" -eq ] ;then
b=
else
b=
fi DEBUG echo "b=$b"
c=
DEBUG echo "c=$c"
发布的时候,记得把调试开关关了,留着代码,也没多大影响。
shell 调试手段总结的更多相关文章
- shell调试选项
[shell调试选项] 一些常用选项的用法: -n 只读取shell脚本,但不实际执行 -x 进入跟踪方式,显示所执行的每一条命令 -c "string" 从strings中读取命 ...
- PCI 设备调试手段
Author: Younix Platform: RK3399 OS: Android 6.0 Kernel: 4.4 Version: v2017.04 一PCI 设备调试手段 busybox ls ...
- (转)shell调试方法
---恢复内容开始--- 转载:https://www.ibm.com/developerworks/cn/linux/l-cn-shell-debug/ Shell脚本调试技术 曹 羽中2007 年 ...
- 解析使用ThinkPHP应该掌握的调试手段
解析使用ThinkPHP应该掌握的调试手段 使用ThinkPHP应该掌握的调试手段经常看到有人问到findAll的返回数据类型是什么之类的问题,以及出错了不知道什么原因的情况,其实还是没有熟悉 ...
- 单片机裸机下写一个自己的shell调试器(转)
源: 单片机裸机下写一个自己的shell调试器
- thinkphp调试手段
使用ThinkPHP应该掌握的调试手段经常看到有人问到findAll的返回数据类型是什么之类的问题,以及出错了不知道什么原因的情况,其实还是没有熟悉ThinkPHP内置的调试手段和方法,抛开IDE本身 ...
- 安卓开发,adb shell 调试sqlite3数据库
安卓开发,adb shell 调试sqlite3数据库 在安卓中创建了sqlite3数据库,想要调试怎么办? 通过adb shell来进行查看. 第一步,将adb加入到系统变量中. 这样就可以在命令行 ...
- 总结一篇shell调试技巧及常见的脚本错误
#常见的调试命令工具 1.使用bash命令参数调试 #使用 [root@game ~]# sh [-xvn] test.sh #参数解释: -x:将执行的脚本内容输出出来,可以看到执行的过程 -n ...
- 程序调试手段之gdb, vxworks shell
调试一个程序主要用到的功能: 启动程序 设置函数断点 设置数据断点 单步执行 查看内存值 修改内存值 linux下的gdb,和vxworks下的shell 虽然使用方式和调试命令略有不同,但是都能满足 ...
随机推荐
- Oracle字符分隔函数(split)
为了让 PL/SQL 函数返回数据的多个行,必须通过返回一个 REF CURSOR 或一个数据集合来完成.REF CURSOR 的这种情况局限于可以从查询中选择的数据,而整个集合在可以返回前,必须进行 ...
- 全球第一本基于Bootstrap V3.x的图书《深入理解Bootstrap》终于上市了,再次免费送书15本【活动结束】
先说活动规则,再说书的事 经过将近1年的努力,终于有了第一本自己独立编写的书:<深入理解Bootstrap>,基于最新版V 3.1 ,侧重于源码详解.架构分析.插件扩展(全新开发)实战.为 ...
- UML:类图复习-鸡生蛋,蛋生鸡
这是前一阵<高级软件工程>课堂上,老师随堂出的一道讨论题,随手贴在这里: ps: 今天是520,正好聊一些OoXx,关于爱的扯淡话题:) 题目:“鸡生蛋,蛋孵鸡”,世间万物生生不息,如何用 ...
- 20145230GDB调试汇编堆栈过程分析
20145230GDB调试汇编堆栈过程分析 分析过程 出现的问题:一开始无法编译,是因为我们的Linux中没有安装一个库. 进入之前先设置断点,之后disassemble可以获取汇编代码,用i r指令 ...
- Chrome扩展开发之二——Chrome扩展中脚本的运行机制和通信方式
目录: 0.Chrome扩展开发(Gmail附件管理助手)系列之〇——概述 1.Chrome扩展开发之一——Chrome扩展的文件结构 2.Chrome扩展开发之二——Chrome扩展中脚本的运行机制 ...
- 分享:关于之前锤子手机刷MIUI之后,现在有事跌宕起伏的刷回了Smartisan OS!
序言: 距离上次把锤子手机刷成MIUI之后已经一个半月了,我是一个刷机党,一个半月足够让我适应一个系统,了解一个系统.刷机有风险,不过我愿意冒这个风险,因为兴趣,没别的.刷机之后,肯定是有问题的,没 ...
- 系统升级日记(4):如何快速的修改Infopath中的各种URL
摘要: 最近一段时间在公司忙于将各类系统进行升级,其最主要的目标有两个,一个是将TFS2010升级到TFS2013,另外一个是将SharePoint 2010升级到SharePoint 2013.本记 ...
- javascript数组去重的4个方法
Array.prototype.unique1 = function(){//有局限性,1,“1”的情况会被去重,因为存入临时对象时,数组中的值被统一转换成了字符串 var obj = {},newA ...
- 一个奇妙的java坑:Long 类型的比较
Long userId=127L; Long authorId=127L; System.out.println(userId==authorId);//true userId=128L; autho ...
- RAP在centos上的部署
在centos7上部署RAP(非官方) 作者批注:该部署文档为网友贡献,仅供参考.war请参考主页README.md下载最新版本哟~~~ 感谢热情网友的Wiki整理!万分感谢! 系统: centos7 ...