shell常用调试方法
检查语法
-n选项只做语法检查,而不执行脚本。
sh -n script_name.sh
启动调试
sh -x script_name.s
进入调试模式后,Shell依次执行读入的语句,产生的输出中有的带加号,有的不带,如下。带加号表示该条语句是Shell执行的。不带加号表示该语句是Shell产生的输出。
+ array=(1 2 3 4 5)
    + for i in '${array[*]}'
    + echo 1
    1
加上-v可将源码一起输出
中断调试
在调试过程中可以按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
shell常用调试方法的更多相关文章
- shell 脚本常用调试方法
		
曾经我刚开始学习 shell 脚本时,除了知道用 echo 输出一些信息外,并不知道其他方法,仅仅依赖 echo 来查找错误,比较难调试且过程繁琐.效率低下.本文介绍下我常用的一些 shell 脚本调 ...
 - VC的常用调试方法
		
前言 VS是非常强大的IDE,所以掌握VSVC的常用方法,将会使得我们找出问题解决问题事半功倍. 目录 VSVC的常用调试方法 前言 1. Watch窗口查看伪变量 2. 查看指针指向的一序列值 3. ...
 - Linux - Shell脚本调试方法
		
Shell脚本调试选项 Shell本身提供一些调试方法选项: -n,读一遍脚本中的命令但不执行,用于检查脚本中的语法错误. -v,一边执行脚本,一边将执行过的脚本命令打印到标准输出. -x,提供跟踪执 ...
 - Shell - Shell脚本调试方法
		
Shell脚本调试选项 Shell本身提供一些调试方法选项: -n,读一遍脚本中的命令但不执行,用于检查脚本中的语法错误. -v,一边执行脚本,一边将执行过的脚本命令打印到标准输出. -x,提供跟踪执 ...
 - shell脚本调试方法
		
我们开启了 Shell 脚本调试系列文章,先是解释了不同的调试选项,下面介绍如何启用 Shell 调试模式. 写完脚本后,建议在运行脚本之前先检查脚本中的语法,而不是查看它们的输出以确认它们是否正常工 ...
 - 【转】 GDB 常用调试方法
		
一.多线程调试 多线程调试可能是问得最多的.其实,重要就是下面几个命令: info thread 查看当前进程的线程. thread <ID> 切换调试的线程为指定ID的线程. break ...
 - Makefile常用调试方法
		
转载自 陈皓<跟我一起写 Makefile><GNU Make项目管理> GNU make 提供了若干可以协助调试的内置函数以及命令行选项. 1.warning函数 $(war ...
 - iPhone页面的常用调试方法
		
在iPhone中调试,大体上与上文 安卓中的移动页面调试 类似,区别主要是iOS系统中的一些限制,导致某些工具无法使用. 本文基于此,简要介绍在iPhone中如何调试页面. 最终可以实现在Mac平台使 ...
 - onvif规范的实现:onvif开发常用调试方法 和常见的segmentation fault错误
		
在前几篇中,虽然已经实现了rtsp视频流的对接,但是还要做的工作还非常多,onvif本来就是一个覆盖面非常广的一个协议,每一个功能都要填充大量的函数.而且稍不注意就会出现segmentation fa ...
 
随机推荐
- [UOJ422]小Z的礼物
			
设要取的物品集合为$S$,$E=n(m-1)+(n-1)m$,$x_T$为覆盖了$T$中至少一个元素的$1\times2$数量 $$\begin{aligned}\sum\limits_{i=1}^\ ...
 - 撩课-Java每天5道面试题第11天
			
86.如何获得高效的数据库逻辑结构? 从关系数据库的表中 删除冗余信息的过程 称为数据规范化, 是得到高效的关系型数据库表的逻辑结构 最好和最容易的方法. 规范化数据时应执行以下操作: 1.将数据库的 ...
 - BZOJ 4197 NOI 2015 寿司晚宴 状压DP
			
4197: [Noi2015]寿司晚宴 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 694 Solved: 440[Submit][Status] ...
 - 通过IP获取所在城市
			
<script type="text/javascript"> var map = new BMap.Map("allmap"); var poin ...
 - 怎么改变html中placeholderr的文字颜色
			
<input type="text" placeholder="这里是提示文本" /> 设置的css代码: ::-webkit-input-plac ...
 - java中HashMap在多线程环境下引起CPU100%的问题解决
			
最近项目中出现了Tomcat占用CPU100%的情况,原以为是代码中出现死循环,后台使用jstack做了dump,发现是系统中不合理使用HashMap导致出现了死循环(注意不是死锁). 产生这个死循环 ...
 - Git_工作区和暂存区
			
Git和其他版本控制系统如SVN的一个不同之处就是有暂存区的概念. 先来看名词解释. 工作区(Working Directory):就是你在电脑里能看到的目录,比如我的learngit文件夹就是一个工 ...
 - 小程序获取当前页面路径url
			
getCurrentPages()[0].route
 - How to Find Processlist Thread id in gdb    !!!!!GDB 使用
			
https://mysqlentomologist.blogspot.jp/2017/07/ Saturday, July 29, 2017 How to Find Process ...
 - 【idea】idea重新打包依赖了父级项目的子级项目,父级项目代码改变,但是子级项目打包依旧是老的代码  问题解决
			
最简单的方法: 就是单独打包父级项目,然后替换本地maven仓库中的父级项目的jar,然后重新打包子级项目,就可以了.