今天的内容比较简单,今天上班的时候,发现了一个问题,就是在一个很长的脚本里面,由于系统版本不同,导致有些字符处理函数处理的过程失效了,没有得到想要的结果,但是脚本执行成功了(想想其实还挺危险)。
于是我用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
可以看到,除了屏幕上输出脚本的执行结果外,还将执行结果打印到了一个文本中,这个也是比较有用的,适用于我们追溯脚本的中间过程。