zoukankan      html  css  js  c++  java
  • 简单调试 Bash 脚本

    用 Bash 写的脚本也可以进行调试,和 Python,Perl 等解释型语言一样。新建一个名为 servinfo 的脚本并增加可执行权限:

    $ vi servinfo
    
    #!/bin/bash
    
    echo "Hostname: $(hostname)"
    echo "Date: $(date)"
    echo "Kernel: $(uname -mrs)"
    
    $ chmod +x servinfo
    

    用 bash -x 来调试上述脚本,Bash 先打印出每行脚本,再打印出每行脚本的执行结果:

    $ bash -x servinfo
    ++ hostname
    + echo 'Hostname: vpsee'
    Hostname: vpsee
    ++ date
    + echo 'Date: Thu Sep  3 19:33:48 SAST 2009'
    Date: Thu Sep  3 19:33:48 SAST 2009
    ++ uname -mrs
    + echo 'Kernel: Linux 2.6.18-128.4.1.el5 i686'
    Kernel: Linux 2.6.18-128.4.1.el5 i686
    

    如果想同时打印行号的话,可以在脚本开头加上:

    export PS4='+${BASH_SOURCE}:${LINENO}:${FUNCNAME[0]}: '
    

    执行结果为:

    $ bash -x servinfo
    + export 'PS4=+${BASH_SOURCE}:${LINENO}:${FUNCNAME[0]}: '
    + PS4='+${BASH_SOURCE}:${LINENO}:${FUNCNAME[0]}: '
    ++4:5:: hostname
    +4:5:: echo 'Hostname: vpsee'
    Hostname: vpsee
    ++4:6:: date
    +4:6:: echo 'Date: Thu Sep  3 19:42:06 SAST 2009'
    Date: Thu Sep  3 19:42:06 SAST 2009
    ++4:7:: uname -mrs
    +4:7:: echo 'Kernel: Linux 2.6.18-128.4.1.el5 i686'
    Kernel: Linux 2.6.18-128.4.1.el5 i686
    

    如果只想调试其中几行脚本的话可以用 set -x 和 set +x 把要调试的部分包含进来:

    #!/bin/bash
    
    echo "Hostname: $(hostname)"
    set -x
    echo "Date: $(date)"
    set +x
    echo "Kernel: $(uname -mrs)"
    

    这个时候可以直接运行脚本,不需要执行 bash -x 了:

    $ ./servinfo
    Hostname: vpsee
    ++ date
    + echo 'Date: Thu Sep  3 19:46:53 SAST 2009'
    Date: Thu Sep  3 19:46:53 SAST 2009
    + set +x
    Kernel: Linux 2.6.18-128.4.1.el5 i686
    

    日志输出

    跟踪日志有时候太多了,多得都受不了,而且,输出的内容很难阅读。一般来说,我们很多时候只关心于条件表达式,变量值,或是函数调用,或是循环等。。在这种情况下,log一些感兴趣的特定的信息,可能会更好。

    使用log前,我们先写一个函数:

    1
    2
    3
    4
    5
    _log() {
        if [ "$_DEBUG" == "true" ]; then
            echo 1>&2 "$@"
        fi
    }

    于是,你就可以在你的脚本中如下使用:

    1
    2
    3
      
    _log "Copying files..."
    cp src/* dst/

     
    我们可以看到,上面那个_log函数,需要检查一个_DEBUG 变量,只有这个变量是真,才会真正开发输出日志。这样,你就只需要控制这个开关,而不需要删除你的debug信息。

    1
    2
      
    $ _DEBUG=true ./example_script.sh

    如果要调试一个非常复杂的 Bash 脚本的话,建议用专门的调试工具,比如:bashdb

  • 相关阅读:
    技术债务墙:一种让技术债务可见并可协商的方法
    墙裂推荐
    shell 脚本通过Webhook 发送消息到微信群
    关于中医的一段对话 [ZZ] -- 思维训练故事
    应用深度神经网络预测学生期末成绩
    Python中的模块引用机制
    批量修改含空格的文件名「Linux」
    Markdown数学公式语法
    批处理修改IP
    FTD团队目录
  • 原文地址:https://www.cnblogs.com/end/p/2864408.html
Copyright © 2011-2022 走看看