如何调试bash脚本?

UAd*_*ter 36 bash debugging

有没有办法在不使用回显和日志记录的情况下调试 bash 脚本?

我说的是使用断点之类的东西。

NES*_*NES 21

有几种不同的方式,即:

  • 使用 -x 选项运行脚本

    bash -x yourscript.sh
    
    Run Code Online (Sandbox Code Playgroud)
  • set -x在 Shebang 之后#!/bin/bash和脚本开始之前在脚本文件的开头添加一个新行,set -v将显示 shell 输入行,set -x显示执行的命令和参数

  • 将脚本文件的shebang替换为 #!/bin/bash -xv


小智 11

现在,有Visual Studio Code Bash Debug 扩展。它有“Step in/out/over”,可以显示每个变量的值。

VS Code Bash 调试截图


ram*_*rur 6

shellcheck 是镇上最好的——

http://www.shellcheck.net/

你也可以与 vim 集成,这里是 git repo——

https://github.com/koalaman/shellcheck


lep*_*epe 5

您可以使用这个小功能进入“控制台”:

function debug
{
    echo "#############|  Entering DEBUG mode  |####################";
    cmd=""
    while [[ $cmd != "exit" ]]; do
        read -p "> " cmd
        case "$cmd" in
            vars ) ( set -o posix ; set );;
            exit ) ;;
            * ) eval "$cmd";;
        esac
    done
    echo "#############|  End of DEBUG mode |####################";
}
Run Code Online (Sandbox Code Playgroud)

然后,在您的脚本中(示例):

for file in *; do
...
   if [[ $file == "strange_case.txt" ]]; then
       # break the code here to analyze:
       debug
   fi
...
done
Run Code Online (Sandbox Code Playgroud)

它将接受任何命令,保持局部变量不变。要退出“调试”模式,请键入“exit”(它不会退出脚本),它将继续执行代码。如果在循环中使用“调试”,则每次都会停止。您可以将其包装在“if”中(如上例所示),或创建一个“watch”函数:

function debug_watch
{
    if [[ $1 == $2 ]]; then
        debug
    fi
}

# And Use it:

debug_watch "$file" "strange_case.txt"
Run Code Online (Sandbox Code Playgroud)

我还添加了“vars”命令,它将转储所有可用的变量及其值。您也可以添加自己的自定义命令。

我在几分钟内完成了代码,因此请自担风险使用它。请注意,在调试模式下可以执行任何命令,因此如果将其留在生产脚本中会带来安全风险。

  • 避免使用大写的变量名。您有覆盖特殊 shell 变量和环境变量的风险。此外,请确保在将参数扩展用作参数时引用它们,以避免结果中出现分词和路径名扩展。例如`* ) eval "$cmd" ;;` 和`debug_watch "$file" strong_case.txt`。 (3认同)