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 ...
随机推荐
- symfony中twig的流程控制if,for用法
流程控制 if 语句 if语句在twig中的作用如同if语句在PHP中的一样.1.你可以通过下面这个简单的例子来判断表达式的结果是否正确. {% if online == false %} <p ...
- Oracle中左右外连接详解
数据表的连接有: 1.内连接(自然连接): 只有两个表相匹配的行才能在结果集中出现 2.外连接: 包括 (1)左外连接(左边的表不加限制) (2)右外连接(右边的表不加限制) (3)全外连接(左右两 ...
- java 用socket制作一个简易多人聊天室
代码: 服务器端Server import java.io.*; import java.net.*; import java.util.ArrayList; public class Server{ ...
- SDUT 2408:Pick apples
Pick apples Time Limit: 1000MS Memory limit: 165536K 题目描述 Once ago, there is a mystery yard which on ...
- 使用 Filter 完成一个简单的权限模型
****对访问进行权限控制: 有权限则可以访问, 否则提示: 没有对应的权限, 请 返回其访问者的权限可以在manager那进行设置:
- 关于BufferedWriter.write超过30W条数据写入过慢问题。
原创文章,转载请注明出处! ------------------------------------------------------------ 今天接到一个项目需求变更,是关于从数据库查询到30 ...
- Asp.net 与 jsp 交互 (打开或跳转页面)
//// 打开固定大小窗体 Response.Write("<script>window.open('Tree1_edit.aspx','child','width=300,he ...
- 查找练习 hash——出现过的数字 分类: 查找 2015-06-18 17:30 7人阅读 评论(0) 收藏
查找练习 hash--出现过的数字 *Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 有一个数据字典,里面存有n个数字(n<=10 ...
- shell脚本中的[]/[[]]区别
转自:http://www.cnblogs.com/include/archive/2011/12/09/2307905.html 引用: http://www.51testing.com/?uid- ...
- c++类中的常量
C++类中的常量 由于#define 定义的宏常量是全局的,不能达到目的,于是想当然地觉得应该用 const 修饰数据成员来实现.const 数据成员的确是存在的,但其含义却不是我们所期望的.cons ...