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语句运行后输出的。

  • 相关阅读:
    SQL Server数据库查询区分大小写、全半角——排序规则的应用
    C#中查询字符串中是否包含指定字符/字符串,使用IndexOf还是Contains?
    【WM6.5】三星I8000按键码及窗体消息发送的方法备忘
    UoBlog 支持 MetaWeblog Api,可以使用 Windows Live Writer 离线发表日志
    C#中如何获取一个字符串的实际字符数
    使用HttpWebRequest发送HTTP请求,同时支持GET/POST方式提交。
    c#.NET中开发可用于Web网页的ActiveX控件
    CorePlex开发手记:一、Winform窗体皮肤及简单换肤机制
    .NET中简易实现线程安全
    在C#中截取指定长度的中文字符串(效率提高2500倍)
  • 原文地址:https://www.cnblogs.com/clnchanpin/p/6813937.html
Copyright © 2011-2022 走看看