前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >shell脚本的调试方法

shell脚本的调试方法

作者头像
AsiaYe
发布2019-12-04 12:00:39
1.1K0
发布2019-12-04 12:00:39
举报
文章被收录于专栏:DBA随笔

今天的内容比较简单,今天上班的时候,发现了一个问题,就是在一个很长的脚本里面,由于系统版本不同,导致有些字符处理函数处理的过程失效了,没有得到想要的结果,但是脚本执行成功了(想想其实还挺危险)。

于是我用vim打开shell脚本,去确定到底是哪一步出现了问题。这个脚本的单次执行时长在5分钟左右,我使用echo命令打印一些标志位的方法,查了大概半个小时吧,因为脚本内容实在是太长了,竟然定位不到问题。很是奇怪。

最后也是在网上才找到了方法,就是利用shell -x的方法去调用脚本,这样能够得到脚本的执行过程,也就可以比较快速的发现问题,为了测试这个shell -x的方法,简单写了个例子:

cat a.sh

#!/bin/bash

a='hello'

echo $a

b='world'

echo $b

echo $a,$b

sh a.sh

hello

world

hello,world

sh -x a.sh

+ a=hello

+ echo hello

hello

+ b=world

+ echo world

world

+ echo hello,world

hello,world

可以看到,a.sh脚本中的内容很简单,就只有打印出来一个hello,world的功能,我们使用sh执行a.sh脚本的时候,会发现打印出来了想要的结果,如果想要更加详细的调试结果,那么就需要使用sh -x的方法了,可以看到,sh -x的方法可以打印出脚本执行的每一个步骤。(说实话之前真的没有用过233)。从一些相关文档中得到了一下的结论:

“-x”选项使shell在执行脚本的过程中把它实际执行的每一个命令行显示出来,并且在行首显示一个"+"号。 "+"号后面显示的是经过了变量替换之后的命令行的内容,有助于分析实际执行的是什么命令。 “-x”选项使用起来简单方便,可以轻松对付大多数的shell调试任务,应把其当作首选的调试手段。

除此之外,如果对于一个很长的脚本,直接使用-x可能会输出一大堆不需要的内容,shell中想到了这种场景,可以支持我们在脚本中使用set的方式来控制是否使用该参数,如下:

cat a.sh

#!/bin/bash

a='hello'

echo $a

set -x

b='world'

echo $b

set +x

echo $a,$b

sh a.sh

hello

+ b=world

+ echo world

world

+ set +x

hello,world

可以看到,使用set的方法,我们可以动态的控制是否输出调试的过程,这样就可以有针对性的去对脚本进行调试了。

除此之外,有时候脚本输出的内容比较多,这个时候,我们更希望将脚本输出的内容打印到文件中,除了使用>符号打印结果到命令中之外,我们还可以使用tee命令,这个命令和>符号的不同之处在于,它除了将结果打印到文件中,还会在屏幕上输出结果,测试如下:

[root@/tmp ]$cat a.sh|tee b.txt

#!/bin/bash

a='hello'

echo $a

set -x

b='world'

echo $b

set +x

echo $a,$b

[root@ /tmp ]$cat b.txt

#!/bin/bash

a='hello'

echo $a

set -x

b='world'

echo $b

set +x

echo $a,$b

可以看到,除了屏幕上输出脚本的执行结果外,还将执行结果打印到了一个文本中,这个也是比较有用的,适用于我们追溯脚本的中间过程。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-11-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DBA随笔 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档