• Bash脚本debug攻略


    初学Bash时, 我从未想过去debug Bash脚本, 也从未想过Bash脚本也能debug. 随着技术的增长, 写的脚本越来越复杂, 使用echo打印日志来调试脚本的方式越来越捉襟见肘了. 直到某天
    通读了一遍Bash Reference Manual, 才发现Bash脚本也是可以debug的. 下面就介绍三种debug Bash脚本的方式.

    1. debug某个脚本

    执行脚本有两种方式, 一是bash script.sh的方式, 二是./script.sh的方式. 通过第一种方式执行脚本时, 加上-x选项即可debug脚本.
    输出的结果中, 以+开头的行就是debug输出的信息.

    $ cat test.sh
    #!/bin/bash
    echo "Time: $(date)"
    echo "User: $USER"
    echo "Home: $HOME"
    $ bash -x test.sh
    ++date
    +echo 'Time: Mon 11 Jul 2022 11:29:37 PM CST'
    Time: Mon 11 Jul 2022 11:29:37 PM CST
    +echo 'User: wbourne '
    User: wbourne
    +echo 'Home: /home/wbourne '
    Home: /home/wbourne

    2. debug特定脚本

    前面说过执行脚本有两种方式, 那如果是用第二种方式执行脚本如何debug呢? 修改脚本的shabangbash -x即可. 每次执行脚本就会输出debug信息.
    此方式适合debug某个特定的脚本, 执行脚本时会默认输出debug信息; 而上面的第一种方式则适合debug任何脚本.

    $ cat test.sh
    #!/bin/bash -x
    echo "Time: $(date)"
    echo "User: $USER"
    echo "Home: $HOME"
    $ ./test.sh
    ++date
    +echo 'Time: Mon 11 Jul 2022 11:32:52 PM CST'
    Time: Mon 11 Jul 2022 11:32:52 PM CST
    +echo 'User: wbourne '
    User: wbourne
    +echo 'Home: /home/wbourne '
    Home: /home/wbourne

    请注意: 如果修改脚本的shabang为bash -x, 又以bash script.sh的方式执行脚本, 会发生什么? 居然没有输出debug信息!!!
    设置shabang表示设置一个默认解释器, 如果没有指定解释器才会使用shabang中写的解释器. 以bash script.sh的方式执行脚本则指定了解释器为bash, 所以不会有debug信息.

    $ bash test.sh
    Time: Mon 11 Jul 2022 11:32:12 PM CST
    User: wbourne
    Home: /home/wbourne

    3. debug脚本某一部分

    如果脚本比较长, 我们之关心其中一部分, 就可以使用Bash内置命令set来debug部分脚本.
    set -x表示开启debug, set +x表示关闭debug

    $ cat test.sh
    #!/bin/bash
    echo "Time: $(date)"
    set -x
    echo "User: $USER"
    set +x
    echo "Home: $HOME"
    $ ./test.sh
    Time: Mon 11 Jul 2022 11:33:43 PM CST
    +echo 'User: wbourne '
    User: wbourne
    +set +x
    Home: /home/wbourne

    4. PS4

    既然是debug, 那肯定要详细才好. 上述debug只不过是输出了变量值而已, 是不是可以显示更多信息? 当然是可以的, debug信息的提示符是环境变量PS4, 默认为+, 我们可以更改PS4的值, 使其输出脚本名, 函数名, 行数等更详细的信息. 这个提示符还是绿色的哦!

    $ echo $PS4
    +
    $ export PS4='+\e[01;32m[${BASH_SOURCE}:${FUNCNAME[0]}:${LINENO}]\e[00m'
    $ bash -x test.sh
    ++[test.sh::3]date
    +[test.sh::3]echo 'Time: Mon 11 Jul 2022 11:35:08 PM CST'
    Time: Mon 11 Jul 2022 11:35:08 PM CST
    +[test.sh::4]echo 'User: wbourne '
    User: wbourne
    +[test.sh::5]echo 'Home: /home/wbourne '
    Home: /home/wbourne

    5. 参考

  • 相关阅读:
    NVIDIA 7th SkyHackathon(二)开发套件的安装与测试
    如何使用AuraDB构建Java微服务
    大语言模型(LLM)综述(一):大语言模型介绍
    【笔者感悟】笔者的学习感悟【五】
    企业虚拟化KVM的三种安装方式(1、完全文本2、模板镜像+配置文件3、gustos图形方式部署安装虚拟机)
    Spring的事件通知
    SSM+基于SSM的智慧社区宠物医院 毕业设计-附源码211621
    C++: 类和对象(中)
    Spring Cloud【SkyWalking服务环境搭建、微服务接入SkyWalking探针、Docker搭建Elasticsearch环境 】(十四)
    mysql group by详解
  • 原文地址:https://www.cnblogs.com/wbourne/p/16468485.html