转 Shell调试篇
检查语法
-n选项只做语法检查,而不执行脚本。
sh -n script_name.sh
启动调试
sh -x script_name.sh
进入调试模式后,Shell依次执行读入的语句,产生的输出中有的带加号,有的不带,如下。带加号表示该条语句是Shell执行的。不带加号表示该语句是Shell产生的输出。2个加号是shell中的子shell 产生的
+ array=(1 2 3 4 5)
+ for i in '${array[*]}'
+ echo 1
1
长代码调试
分段,分函数调试
中断调试
在调试过程中可以按Ctrl + Z中断调试,观察结果,然后再按fg键继续调试即可。
调试代码块
上面的-x选项是调试整个脚本的,如果脚本很大,会很不方便,还有一种方法是调试某一块代码的,如下
set -x
...
code block
...
set +x
这样,只对set -x与set +x之间的代码进行跟踪。
调试函数
set -x Function call set +x
常见错误诊断
xxx.sh: cannot shift
这种错误一般是参数传递有误,比如没有给参数,或者参数个数少了。因为shell脚本使用shift来获取下一个参数,如果个数不对,shift命令就会失败。
xxx.sh: ^M: not found
^M是Windows上的回车符\r在UNIX上的显示形式。这种情况多半是在Windows上编辑了shell脚本,然后拿到UNIX/Linux上执行。只要将文件中所有的\r删除即可。
tr -d "\r" <oldfile.sh > newfile.sh
或者一个更标准的方法,因为\r的ASCII码是\015,所以可以这样。
tr -d "\015" < oldfile.sh > newfile.sh
设置调试陷阱
稍后继续。。。
sample: 一个shell 输出如下:
+ ORAENV=oraenv ->shell 产生
++ ps -e -o args ->子shell 产生
++ grep pmon
++ grep -v grep
++ awk -F_ '{print $3}'
++ sort
+ SIDS='stat10g -> 回到shell
statdb'
++ echo stat10g statdb
+ for ORACLE_SID in '`echo $SIDS`'
+ ORAENV_ASK=NO
+ export ORACLE_SID
+ . oraenv ->shell 产生
+++ uname -s -> 子子shell 产生
++ MACH_TYPE=Linux
++ case ${MACH_TYPE} in
++ ORATAB=/etc/oratab
++ TNS_ADMIN=/etc
++ ORA_ORAENV=/usr/local/bin/ora_oraenv
++ export TNS_ADMIN ORA_ORAENV
+++ awk -F: '/^[^#]/{printf "\n %s",$1}' /etc/oratab
++ SIDLIST='
stat10g
statdb
oemdb
cdboem'
++ case "${ORAENV_ASK:-''}" in
++ . /usr/local/bin/ora_oraenv
+++ SILENT=
+++ case ${ORACLE_TRACE:-""} in
+++ N=
+++ C=
+++ echo '\c'
+++ grep c
+++ N=-n
+++ '[' /oracle11g/product/11.2 = 0 ']'
+++ OLDHOME=/oracle11g/product/11.2
+++ case ${ORAENV_ASK:-""} in
+++ NEWSID=stat10g
+++ export ORACLE_SID
++++ dbhome stat10g
+++ ORAHOME=/oracle10g/product/10.2
+++ case $? in
+++ ORACLE_HOME=/oracle10g/product/10.2
+++ export ORACLE_HOME
+++ case ${LD_LIBRARY_PATH:-""} in
++++ echo /oracle11g/product/11.2/lib
++++ sed 's;/oracle11g/product/11.2/lib;/oracle10g/product/10.2/lib;g'
+++ LD_LIBRARY_PATH=/oracle10g/product/10.2/lib
+++ export LD_LIBRARY_PATH
+++ case "$OLDHOME" in
+++ case "$PATH" in
++++ echo /usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/opt/perf/bin:/home/oracle/bin:/oracle11g/product/11.2/bin:/oracle11g/local::/oracle11g/product/11.2/bin:
++++ sed 's;/oracle11g/product/11.2/bin;/oracle10g/product/10.2/bin;g'
+++ PATH=/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/opt/perf/bin:/home/oracle/bin:/oracle10g/product/10.2/bin:/oracle11g/local::/oracle10g/product/10.2/bin:
+++ export PATH
++++ LANG=C
++++ ulimit
+++ ULIMIT=unlimited
http://www.cnblogs.com/softwaretesting/archive/2012/02/06/2339671.html
转 Shell调试篇的更多相关文章
- Shell调试篇 转
检查语法 -n选项只做语法检查,而不执行脚本. sh -n script_name.sh 启动调试 sh -x script_name.sh 进入调试模式后,Shell依次执行读入的语句,产生的输出中 ...
- 总结一篇shell调试技巧及常见的脚本错误
#常见的调试命令工具 1.使用bash命令参数调试 #使用 [root@game ~]# sh [-xvn] test.sh #参数解释: -x:将执行的脚本内容输出出来,可以看到执行的过程 -n ...
- shell调试选项
[shell调试选项] 一些常用选项的用法: -n 只读取shell脚本,但不实际执行 -x 进入跟踪方式,显示所执行的每一条命令 -c "string" 从strings中读取命 ...
- 【转】Android LCD(四):LCD驱动调试篇
关键词:android LCD TFTSN75LVDS83B TTL-LVDS LCD电压背光电压 平台信息:内核:linux2.6/linux3.0系统:android/android4.0 平台 ...
- OD调试篇3-小软件破解1
OD调试篇3-小软件破解1 要求如下图该软件需要改5个地方,其中1.2是软件未注册而设定限定的添加个数,3.4.5是软件显示的一些未注册的信息. 一. 1.按1运行程序,添加用户添加第五个时出现提示, ...
- OD调试篇1—Hello
OD调试篇1—Hello 要求:通过OD将程序的标题“I love fishc.com”改为“I love you” 一.找到程序的标题“I love fishc.com” 1.把程序拖到OD运行出现 ...
- VC调试篇
难怪很多前辈说调试是一个程序员最基本的技能,其重要性甚至超过学习一门语言.不会调试的程序员就意味着他即使会一门语言,却不能编制出任何好的软件. 我以前接触的程序大多是有比较成形的思路和方法,调试起来出 ...
- 单片机裸机下写一个自己的shell调试器(转)
源: 单片机裸机下写一个自己的shell调试器
- 安卓开发,adb shell 调试sqlite3数据库
安卓开发,adb shell 调试sqlite3数据库 在安卓中创建了sqlite3数据库,想要调试怎么办? 通过adb shell来进行查看. 第一步,将adb加入到系统变量中. 这样就可以在命令行 ...
随机推荐
- 【HDOJ3047】Zjnu Stadium(带权并查集)
题意:浙江省第十二届大学生运动会在浙江师范大学举行,为此在浙师大建造了一座能容纳近万人的新体育场. 观众席每一行构成一个圆形,每个圆形由300个座位组成,对300个座位按照顺时针编号1到300,且可以 ...
- Memory Ordering in Modern Microprocessors
Linux has supported a large number of SMP systems based on a variety of CPUs since the 2.0 kernel. L ...
- msp430入门编程10
msp430中C语言操作端口I/O10 msp430中C语言的模块化头文件及实现11 msp430中C语言的模块化头文件及库文件12 msp430入门学习 msp430入门编程
- [bzoj3160]万径人踪灭_FFT_Manacher
万径人踪灭 bzoj-3160 题目大意:给定一个ab串.求所有的子序列满足:位置和字符都关于某条对称轴对称而且不连续. 注释:$1\le n\le 10^5$. 想法: 看了大爷的题解,OrzOrz ...
- [bzoj3712][PA2014]Fiolki_倍增LCA
Fiolki bzoj-3712 PA-2014 题目大意:题目链接. 注释:略. 想法: 神题! 我们建树:对于一次倾倒操作,我们弄一个新的大瓶子作为两个合并瓶子的父亲节点,与两个瓶子相连. 对于一 ...
- pydevd 一次trouble shooting
只是一次小的trouble shooting. 關於python的遠程調試功能.但是由於思路混亂.浪費了許多時間,記錄一下整個過程.作爲改進的參考. 问题背景: 我之前一直在ubuntu上用pycha ...
- CSDN 夏令营程序 试题分析 (2)
题目:若须要在O(nlogn)(以2为底)的时间内完毕对数组的排序.且要求排序是稳定的,则可选择的排序方法是: A.高速排序 B.堆排序 C.归并排序 D.直接插入 ...
- 【转】使用Python中HTTPParser模块进行简单的html解析
http://www.cnblogs.com/coser/archive/2012/01/09/2317076.html
- Linux学习系列之Inotify+Rsync实现实时数据同步
Inotify简介 inotify介绍 inotify是一种强大的.异步的文件系统监控机制,linux内核从2.6.13起,加入了inotify的支持,通过inotify可以监控文件系统中添加.删除. ...
- Spark修炼之道(基础篇)——Linux大数据开发基础:第二节:Linux文件系统、文件夹(一)
本节主要内容 怎样获取帮助文档 Linux文件系统简单介绍 文件夹操作 訪问权限 1. 怎样获取帮助文档 在实际工作过程其中,常常会忘记命令的使用方式.比如ls命令后面能够跟哪些參数,此时能够使用ma ...