16 shell调试技术
trap 命令
基本格式: trap command sig1 sig2 ... sigN
有3种信号可以捕获:
EXIT : 从函数中退出, 或整个脚本执行完毕
ERR: 当一条命令返回非0状态码, 即命令执行不成功
DEBUG: 脚本汇总每一条命令执行前
演示 DEBUG (一般使用这个方法查看整个程序的所有执行情况)
#!/bin/bash
trap 'echo "before execute line:$LINENO, a=$a,b=$b,c=$c"' DEBUG
a=0
b=2
c=100
while :
do
if ((a >= 10))
then
break
fi
let "a=a+2"
let "b=b*2"
let "c=c-10"
done
运行结果如下:
演示: EXIT (一般使用这个方法来判断某一个函数是否成功执行)
#!/bin/bash
func1()
{
echo "This is an correct function "
var=2010
return 0
}
trap 'echo "Line:$LINENO, var=$var"' EXIT #这个语句表示, 如果下边的fun1正确执行, 那么这里就显示 var=$var的值(20)
fun1
演示: ERR
#!/bin/bash
func2()
{
echo "This is an error function"
var=2010
return 1
}
trap 'echo "Line: $LINENO, var=$var"' ERR #这个语句表示, 如果下边的fun2是否为错误执行, 那么这里就显示 var=$var的值(20)
func2
调试钩子
调试钩子源自于高级程序设计语言中的方法, 实际上是一个if/then结构代码块, DEBUG变量控制该代码块是否执行, 在程序开发调试阶段,
讲DEBUG变量设置为TRUE, 使其输出调试信息, 到了程序交付使用阶段, 讲DEBUG设置为FALSE, 关闭调试钩子, 而无需一一删除调试钩子代码,
if [ "$DEBUG" = "true" ]
then
echo "Debugging information"
fi
调试钩子中的DEBUG是一个全局变量, 在开发调试阶段, 可以利用export DEBUG=true 命令将DEBUG设置为true, 如果在每一处都需要输出调试
信息的地方均使用if/then结构来判断DEBUG变量的值, 显的比较繁琐, 我们可以通过定义一个DEBUG函数使植入调试钩子的过程更为简洁:
#!/bin/bash
DEBUG()
{
if [ "$DEBUG" = "true" ]
then
$@
fi
}
执行脚本前, 先 export DEBUG=true, 然后执行./脚本名
使用shell选项 (跟我之前知道几乎一样)
sh -n 脚本名 : 读取脚本中的命令, 进行语法检查, 但是并执行这些命令
sh -x 在执行每个命令之前, 讲每个命令打印到标准输出(好用, 首选调试工具, 一般与trap的DEBUG共同使用, 这样既可以输出实际执行的每一行命令, 又
可以逐行跟踪变量的值, 而且trap与这个-x都是在标准输出, 所以自动配合的非常好)
-x 选项以 "+"符号作为提示符表示调试信息, 显得美中不足, 如果提示符能包含一些重要信息, 对调试更有帮助, 那么, 我们能否定制-x选项的提示符呢?
答案是肯定的.
LINENO 表示shell脚本的行号
FUNCNAME 数组变量, 表示整个调用链上所有的函数名
PS4 设置-x选项的提示符, 默认是"+"符号
我们可以通过设置PS4, 使得-x选项提示符能包含LINENO和FUNCNAME等丰富的信息, 例如:
(下图是 sh-x 与 trap DEBUG 一起使用)
例如:
#!/bin/bash
isroot()
{
if [ "$UID" -ne 0 ]
then
return 1
else
return 0
fi
}
echoroot()
{
isroot
if [ "$?" -ne 0 ]
then
echo "I am not root user!"
else
echo "root user!"
fi
}
export PS4='+{$LINENO:${FUNCNAME[0]}:${FUNCNAME[1]}}' #这里的PS4是, 显示本行号, 当前函数名, 调用当前函数的函数名
exchoroot
(下图只是展示 PS4, 没有设置 trap DEBUG 功能)
16 shell调试技术的更多相关文章
- 【转】Linux Shell脚本调试技术
本文转载自:https://www.ibm.com/developerworks/cn/linux/l-cn-shell-debug/ Shell脚本调试技术 本文全面系统地介绍了shell脚本调试技 ...
- shell脚本调试技术_转
转自:http://itlab.idcquan.com/linux/SHELL/727128.html 参考:https://linux.cn/article-8045-1.html 本文全面系统地介 ...
- Shell脚本调试技术
http://www.ibm.com/developerworks/cn/linux/l-cn-shell-debug/ 一. 前言 shell编程在unix/linux世界中使用得非常广泛,熟练掌握 ...
- Shell脚本的调试技术
编程中必不可少的一点就是调试,Shell脚本以其强大的功能令人向往,当然,它的强大之处不只是体现在语言的实现功能上,更强大的是它的调试功能,下面,我将以实例讲解Shell脚本的调试技术. 下面是我所用 ...
- [转载]Android开发常用调试技术记录
ANDROID 调试技术: 1)Ps 指令 ls –l /proc/27/ cat /proc/27/cmdline #cmdline文件表示了这个进程所在的命令行. cat /proc/ ...
- (转)shell调试方法
---恢复内容开始--- 转载:https://www.ibm.com/developerworks/cn/linux/l-cn-shell-debug/ Shell脚本调试技术 曹 羽中2007 年 ...
- 掌握 Linux 调试技术
掌握 Linux 调试技术 在 Linux 上找出并解决程序错误的主要方法 Steve Best (sbest@us.ibm.com)JFS 核心小组成员,IBM 简介: 您可以用各种方法来监控运行着 ...
- iOS 开发者旅途中的指南针 - LLDB 调试技术
文章转载于:iOS 开发者旅途中的指南针 - LLDB 调试技术 今天给大家介绍的内容,无关乎任何功能性开发技术,但又对开发的效率影响至深,这就是调试技术. 何为调试呢,比如我们用 print 函数在 ...
- Linux kprobe调试技术使用
kprobe调试技术是为了便于跟踪内核函数执行状态所设计的一种轻量级内核调试技术. 利用kprobe技术,可以在内核绝大多数函数中动态插入探测点,收集调试状态所需信息而基本不影响原有执行流程. kpr ...
随机推荐
- Python升级Yum不能使用解决
1.系统版本 [root@vm10-254-206-95 ~]# cat /etc/issue CentOS release 6.4 (Final) Kernel \r on an \m 2.系统默认 ...
- DedeCMS模板文件不存在,无法解析文档! 问题定位方法
生成静态的时候,经常会遇到“模板文件不存在,无法解析文 档!”的问题.很多朋友试过论坛里很多方法,都是针对某些人可以解决,某些人的问题依旧,为什么呢?其实问题很可能确实是多种多样的,表现结果却是一样, ...
- css弹性盒子学习
css3弹性盒子是一种布局方式,在适应不同的屏幕大小的时候,能够确保元素拥有更恰当的排布行为.它只是视觉呈现上的,即显示顺序适应显示空间,与源代码无关,源代码顺序不受影响. 定义一个弹性盒子: 在cs ...
- Python 日期和时间
Python 程序能用很多方式处理日期和时间,转换日期格式是一个常见的功能. Python 提供了一个 time 和 calendar 模块可以用于格式化日期和时间. 时间间隔是以秒为单位的浮点小数. ...
- android应用程序中获取view 的位置
1. 相对位置: getLeft() , getRight(), getTop(), getBottom() 在Android中可以把left相当于X轴值, top相当于Y轴值, 通过这两个值Andr ...
- asp.net 关闭子窗体 刷新主窗体
主窗体************************************************************************************ //原窗口保留,以对话框 ...
- Poj(3686),最小权匹配,多重匹配,KM
题目链接 The Windy's | Time Limit: 5000MS | Memory Limit: 65536K | | Total Submissions: 4939 | Accepted: ...
- Poj(2135),MCMF,模板
题目链接:http://poj.org/problem?id=2135 Farm Tour Time Limit: 1000MS Memory Limit: 65536K Total Submis ...
- ReentrantLock的原理学习
转载:https://my.oschina.net/andylucc/blog/651982 摘要 提到JAVA加锁,我们通常会想到synchronized关键字或者是Java Concurrent ...
- Scala循环操作
val buf = new scala.collection.mutable.ArrayBuffer[Int] for (i <- 0 to 10) { buf += i } buf += 11 ...