• 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. 参考

  • 相关阅读:
    面试官:Java池化技术你了解多少?
    Git的常见操作
    JuiceFS 社区版 v1.1- Beta 发布,新增五个实用功能
    图形学--shading着色
    范数-空间范数
    【智能优化算法】基于改进生物地理学优化算法求解单目标优化问题附matlab代码
    使用CSS实现多种Noise噪点效果
    国内首发可视化智能调优平台,小龙带你玩转KeenTune UI
    基于JavaGUI的简易图书管理系统
    【2023C卷题限时免费】20天拿下华为OD笔试之 【不定滑窗】2023C-最长的指定瑕疵度的元音子串【欧弟算法】全网注释最详细分类最全的华为OD真题题解
  • 原文地址:https://www.cnblogs.com/wbourne/p/16468485.html