一、脚本的追踪与调试
sh [-nvx] scripts.sh
-n: 不要执行脚本,仅查询语法问题
-v: 在执行脚本前,先将脚本的内容输出到屏幕上
-x: 将脚本的执行过程全部列出来(代码是什么,然后输出什么,写的相当清楚)
1.1 调试脚本 move_more_10k.sh
脚本内容
脚本所表达的意思很明显,就是将目录/home/songbw/QQ_xiao下,文件大小大于10k的文件复制到 /home/songbw/10_topic下,一开始我将此脚本放在/home/songbw/shell/10_problem/ 目录下,然后去执行这个脚本,一直出现类似:
cp: 无法 stat “serverApp.o” : 没有那个文件或目录的错误
我好傻,一直以为是脚本不能够识别目录 /home/songbw/10_topic,后来我用sh -x move_more_10k.sh进行调试,它会具体显示出某一条代码和其执行结果,如下:
我才意识到脚本不能识别的是serverApp.o,细想想是这样的,因为脚本是在/home/songbw/shell/10_problem/下面,好比是在这下面执行命令 cp serverApp.o /home/songbw/10_topic,那么它肯定识别不了 serverApp.o,因为下面根本就没有这个文件,顿时我意识到了这个问题,把脚本放在了 /home/songbw/QQ_xiao/ 下面,立刻就执行成功了。
所以以后一定要注意:
脚本所在的目录,看当前目录下有没有相应的文件,能不能识别。
1.2 调试脚本 changedir.sh
脚本内容:
脚本的意思非常简单,就是将当前目录切换到目录,问题是,当执行这个脚本的时候,没有任何的变化,并不能切换到我想切换的目录,原因如下:
我是以 ./changedir.sh 的方式执行的,这样执行的话,终端会产生一个子shell,子shell 去执行我的脚本,在子shell 中已经切换了目录,但是子shell 一旦执行完,马上退出,子shell 中的变量和操作全部都收回,回到终端,根本就看不到,这个过程的变化
还记得在”shell 脚本笔记”中,执行脚本的b方式中所述,”当执行一个脚本文件时,shell会产生一个子shell(即一个子进程)去执行脚本文件中的命令。因此,脚本文件中的变量值不能传递到当前shell(即父shell)。所以为了使脚本文件中的变量值传递到当前shell,必须在脚本文件名前加“source”或“.”命令,即source script-file 或
. Script-file”,所以当我输入命令source changedir.sh,立刻就切换了目录。