揭秘Bash脚本调试:你不知道的秘密工具和技巧

调试在编程过程是一种非常很常见的,它能让程序员逐行检查代码,观察变量以及程序在执行过程中的行为,还能在程序执行的各个阶段检查其状态,从而帮助程序员更有效率地找出并修复错误。

file

本文将深入探讨如何调试Bash shell脚本的各种技巧

使用shellcheck工具进行静态分析

ShellCheck是一个开源的静态分析工具,可以检测脚本中的错误并提供修复建议。例如,你可以在命令行中运行shellcheck myscript.sh,ShellCheck就会列出脚本中的所有问题和建议的修复方法。

安装

  • Redhat/Yum
    sudo yum install shellcheck
  • Fedora:
    sudo apt install shellcheck
  • Debian-based
    sudo apt install shellcheck

使用Bash调试参数

Bash提供了一些选项,可以帮助你调试脚本,包括:

  • noexec模式(-n):在执行脚本之前进行干运行,检查脚本的语法,但不会执行脚本。例如,你可以运行bash -n myscript.sh来检查脚本的语法。

  • 详细选项(-v):设置此选项后,脚本中的每个命令在执行前都会打印到标准输出(stdout)。例如,你可以运行bash -v myscript.sh来查看脚本的每一步操作。

  • xtrace选项(-x):通过在执行前将每行命令的扩展结果打印到stdout,帮助我们调试代码中的逻辑错误。例如,你可以运行bash -x myscript.sh来查看每行命令的扩展结果。

  • unset选项(-u):如果我们试图引用一个未定义的变量,这个选项会抛出一个错误,并立即终止脚本。例如,你可以运行bash -u myscript.sh来检查是否有未定义的变量。

调试部分脚本

你可以在代码块前启用调试选项,然后使用set +<option>命令在之后禁用它,以便只调试脚本的特定部分。例如:

   # 开启xtrace选项
   set -x
   # 这部分将会被跟踪
   echo "Hello, world!"
   # 关闭xtrace选项
   set +x
   # 这部分将不会被跟踪
   echo "Goodbye, world!"

在运行时启用选项

Bash还允许在调用脚本时从命令行设置这些选项。例如,你可以运行bash -x myscript.sh来在运行脚本时启用xtrace选项。

使用trap命令

trap命令允许我们指定一个命令或一组命令在脚本中的每个语句之前重复执行。例如,你可以使用trap命令来在每个命令之前打印当前的时间:

   trap 'echo "Current time: $(date)"' DEBUG

使用strace调试运行中的脚本

strace是一个命令行工具,可以用来跟踪程序和内核之间的系统调用。例如,你可以运行strace -p <pid>来跟踪一个正在运行的进程的系统调用。

优雅bash脚本Demo

参考:https://github.com/bertvv/dotfiles/blob/main/.vim/templates/sh

#! /usr/bin/env bash
#
# Author: Bert Van Vreckem <bert.vanvreckem@gmail.com>
#
#/ Usage: SCRIPTNAME [OPTIONS]... [ARGUMENTS]...
#/
#/ 
#/ OPTIONS
#/   -h, --help
#/                Print this help message
#/
#/ EXAMPLES
#/  

#{{{ Bash settings
# abort on nonzero exitstatus
set -o errexit
# abort on unbound variable
set -o nounset
# don't hide errors within pipes
set -o pipefail
#}}}
#{{{ Variables
IFS=$'\t\n'   # Split on newlines and tabs (but not on spaces)
script_name=$(basename "${0}")
script_dir=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
readonly script_name script_dir

#}}}

main() {
  # check_args "${@}"
  :
}

#{{{ Helper functions

#}}}

main "${@}"

# cursor: 33 del
JS获取随机字符串的几种方法
Bash脚本小技巧:使用getopts优雅处理命令行选项

发表我的评论

电子邮件地址不会被公开。 必填项已用*标注

10 + 45 =

ajax-loader