菜单

Shell脚本调试方法

2019年10月22日 - 计算机教程
  1. sh –n test.sh :测试脚本的语法错误

●Shell的调试

sh –x test.sh /set –x  :跟踪所有命令行

BASH 又有什么调试手段呢?

sh –e tesh.sh /set –e  :如果一个命令失败就立即退出

 

2.debug=1

1 echo/printf

test $debug –gt 0 && echo “this is a debug info.”

打印一些变量,或者提示信息。这应该是一个通用的方法了。在
BASH 里,我们可以简单的用 echo,或者 printf 来输出一些 log,或者加一些
loglevel 来过滤一些 log。

  1. trap ‘command’ signal

 

EXIT
 从一个函数中退出或整个脚本执行完毕
 
ERR
 当一条命令返回非零状态时(代表命令执行不成功)
 
DEBUG
 脚本中每一条命令执行之前 

_loglevel=2

trap ‘echo “before execute :$LINENO, a=$a,b=$b”’ DEBUG

DIE() {

图片 1

    echo “Critical: $1” >&2

    exit 1

}

INFO() {

    [ $_loglevel -ge 2 ] && echo “INFO:
$1” >&2

}

ERROR() {

    [ $_loglevel -ge 1 ] && echo “ERROR:
$1” >&2

}

这里的实现只是简单的加了一个
loglevel,其实可以把 log 输出到一个文件中,或者给 log
加上颜色。比如:

 

# add color

[ $_loglevel -ge 1 ] && echo -e
“\033[31m ERROR:\033[0m $1” >&2

# redirect to file

[ $_loglevel -ge 1 ] && echo “ERROR: $1”
> /var/log/xxx_log.$BASHPID

 

2 set
-x

-x(xtrace) 选项会导致 BASH
在执行命令之前,先把要执行的命令打印出来。这个选项对调试一些命令错误很有帮助。

 

有的时候,由于传进来的参数带有一些特殊字符,导致
BASH 解析时不是按照我们预想的进行。这个时候,把 -x
打开,就能在命令执行前,把扩展后的命令打印出来。比如基于前面写的函数:

 

set -x

INFO “this is a info log”

ERROR “this is a error log”

set +x

然后就可以看到如下输出:

 

 INFO: this is a info log

 ERR: this is a error log

如果想全程打开
xtrace,可以在执行脚本的时候加 -x 参数。

 

3 trap/bashdb

为了方便调试,BASH
也提供了陷阱机制。这跟之前介绍的两种方法高级不少。我们可以利用 trap
这个内置命令来指定各个 sigspec 应该执行的命令。trap
的具体用法如下:

 

trap [-lp] [[arg] sigspec …]

sigspec 包括 <signal.h> 中定义的各个
signal, EXIT,ERR,RETURN 和 DEBUG。

 

各个 signal 这里就不介绍了。EXIT 会在 shell
退出时执行指定的命令。若当前 shell 中有命令执行返回非零值,则会执行与
ERR 相关联的命令。而 RETURN 是针对 source 和 . ,每次执行都会触发 RETURN
陷阱。若绑定一个命令到 DEBUG,则会在每一个命令执行之前,都会先执行 DEBUG
这个 trap。这里要注意的是,ERR 和 DEBUG 只在当前 shell
有效。若想函数和子 shell 自动继承这些 trap,则可以设置 -T(DEBUG/RETURN)
和 -E(ERR)。

 

比如,下面的脚本会在退出时,执行echo:

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图