zoukankan      html  css  js  c++  java
  • 《学习bash》笔记--调试shell程序

    在shell中,最简单的调试助手时输出语句echo,能够通过把很多echo语句放到代码中进行调试,但必须花费足够的时间以定位

    要查看的信息。可能必须通过很多的输出才干发现要查找的信息。

    1.set选项

    最主要的时set -o命令选项,当执行脚本时,这些选项能够用在命令行上。例如以下表所看到的:
    set -o选项      命令行选项      行为
    noexec            -n                     不执行命令,值检查语法错误
    verbose           -v                     在执行命令前回送它们
    xtrace               -x                     回送进行替换处理后的命令

    脚本a.sh的内容为:
    set -n
    if cd /dev; do
    echo "in dev
    运行脚本结果:
    $ ./a.sh 
    ./a.sh: line 2: syntax error near unexpected token `do'
    ./a.sh: line 2: `if cd /dev; do'
    d

    脚本a.sh的内容为:
    set -v
    echo "1"
    echo "2"
    运行脚本结果:
    $ ./a.sh 
    echo "1"
    1
    echo "2"
    2
     
    脚本a.sh的内容为:
    set -x
    echo "$PWD"
    运行脚本结果:
    ++ echo /home/yanwenjie/bashtest
    /home/yanwenjie/bashtest
    -x选项将回送经过參数替换、命令替换和其它命令行处理步骤后得到的命令行结果。

    x选项在每一行開始都打印+,(可是不知道为什么我这边打印了2个),这实际上能够定制的,它是内置变量shell变量PS4的值。能够
    通过改动PS4的值来改动这个符号。

    比如脚本a.sh的内容例如以下:
    PS4="debug->"
    set -x
    echo "$PWD"
    运行结果:
    $ ./a.sh 
    ddebug->echo /home/yanwenjie/bashtest
    /home/yanwenjie/bashtest
    (不知道为什么这边出现了2个d。

    。谁能回答一下)


    让我们简单回想一下PS1,PS2,PS3的作用:
    PS1是用来控制shell提示符的样式。比如我登陆shell的式样是:root@ywjPC:~# 
    PS2是当我们输入""时。多行提示符的样式,默认是">".
    PS3是Shell脚本中使用select时的提示符。

    2.伪信号

    伪信号和工作方式和trap一样。但它们时由shell本身产生,能够像对待shell脚本里的实际信号一样对待它。

    伪信号     发送时间
    EXIT         shell从脚本中退出后
    DEBUG   shell已经运行了一个语句

    注意:是伪信号,在真正的信号中是不包括这两个的。

    linux的信号例如以下:

     1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP  
     6) SIGABRT      7) SIGBUS       8) SIGFPE       9) SIGKILL     10) SIGUSR1  
    11) SIGSEGV     12) SIGUSR2     13) SIGPIPE     14) SIGALRM     15) SIGTERM  
    16) SIGSTKFLT   17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP  
    21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ  
    26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO       30) SIGPWR  
    31) SIGSYS      34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3  
    38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8  
    43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13  
    48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12  
    53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7  
    58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2  
    63) SIGRTMAX-1  64) SIGRTMAX

    2.1.EXIT

    比如以下的脚本a.sh:
    trap "echo 'exit from shell'" EXIT
    echo "hello"
    运行结果:
    # ./a.sh 
    hello
    exit from shell
    比如採用kill的方式则无法运行trap代码。

    2.2.DEBUG

    DEBUG用来在一个函数或脚本内全部语句后运行陷阱代码。

    它的主要用途是用来作为一种跟踪错误的程序状态元素的强制性

    方法。
    比如以下的脚本a.sh:
    function dbgtrap
    {
    echo "i=$i"
    }

    i=1
    trap dbgtrap DEBUG
    i=$((i+1))
    i=$((i+1))
    i=$((i+1))
    trap - DEBUG
    脚本中两个trap之间的每条语句运行后都会运行dbgtrap函数。包括第一个trap语句。

    运行结果:
    # ./a.sh 
    i=1
    i=2
    i=3
    i=4
    当中i=1是trap dbgtrap DEBUG语句运行后输出的。

  • 相关阅读:
    认证功能装饰器
    装饰器升级版
    装饰器
    闭包函数
    名称空间与作用域
    嵌套函数
    函数对象
    命名关键字参数
    函数单数的使用
    函数的定义与调用
  • 原文地址:https://www.cnblogs.com/clnchanpin/p/6813937.html
Copyright © 2011-2022 走看看