如何调试bash脚本?

有没有办法调试bash脚本而不使用echo和logging?

我在谈论使用断点和类似的东西。

是的,有Bash调试器项目 。

替代文字

您还可以在执行时使用set -xset-v 。 这里和这里或这里有一些信息。

祝好运!

有几种不同的方式,即:

  • 使用-x选项运行脚本

     bash -x yourscript.sh 
  • 在Shebang #!/bin/bash之后的脚本文件开头的新行中添加set -x在脚本开始之前, set -v将显示shell输入行, set -x显示已执行的命令和参数

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

shellcheck是镇上最好的 –

http://www.shellcheck.net/

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

https://github.com/koalaman/shellcheck

现在,有Visual Studio Code Bash Debug扩展 。 它具有“进/出/结束”function,可以显示每个变量的值。

VS Code Bash Debug截图

你可以使用这个小function进入“控制台”:

 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 |####################"; } 

然后,在你的脚本里面(例子):

 for FILE in *; do ... if [[ $FILE == "strange_case.txt" ]]; then # break the code here to analyze: debug fi ... done 

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

 function debug_watch { if [[ $1 == $2 ]]; then debug fi } # And Use it: debug_watch $FILE "strange_case.txt" 

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

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

用于调试bash脚本的GUI选项是带有BashEclipse / Shelled插件的Eclipse IDE。

这提供了您的问题的特征( breakpoints and stuff )以及用于调试复杂bash脚本的许多其他function。

部分function包括:
https://unix.stackexchange.com/questions/155551/how-to-debug-a-bash-script

  • 断点切换
  • 单步操作
  • 步入,步出,步进function和子程序
  • 在脚本运行时随时检查代码变量
  • TODO任务列表
  • 书签列表
  • 多窗口编辑
  • 远程共享项目环境

脚本编辑器透视图: Eclipse脚本IDE

调试透视图: Eclipse Script Debug Perspective

使用的步骤是将ShelledBashEclipse插件添加到eclipse。 然后运行BashEclipse自述文本文件中提供的过程以启动调试器。

根据NES的说法,在bash中设置标志以允许调试。

set -x标志可以从终端设置和取消设置,也可以在脚本中设置。 使用+-

 #!/bin/bash #fileinfo ls -l $1 set -x # start debugging here wc -l $1 set +x # stop debugging here file $1 set -v # start verbose output w | more echo "" echo -n "Number of users: " set +v # end verbose output who | wc -l 

以下是set命令的作用:

  • set -f使用元字符禁用文件名生成。
  • set -v在读取时打印(详细)shell输入行。
  • set -x在执行命令之前打印命令跟踪。

set实际上有很多function,但可悲的是没有man page,因为它是一个内置工具的shell。 set的手册在GNU Bash文档中 。

有许多命令行工具可以帮助您获得有关您的程序的详细信息,如:

  • stat显示文件或文件系统状态
  • file确定文件类型。
  • hexdumpfilter,以各种格式显示指定的文件
  • nohup运行一个不会挂起的脚本

    和许多其他人。 我试图想出显示隐藏字符的命令,但我现在无法做到。 Hexdump会做,但有一个更好的。

键命令ctrl \将导致正在运行的程序或脚本进行核心转储。 然后你可以分析coredump。 我可能会使用gdb来分析coredump,但是很多程序都存在。

bash shell也有一些漂亮的调试选项。 选项--debugger-v verbose, – --dump-strings和其他漂亮的选项来帮助你。 使用man bash检查它们。

trap命令(内置shell)对您非常有帮助。 陷阱说如果你的程序意外退出,执行一些事情。 您在这里阅读了有关陷阱和其他方便的Bash Shell内容。

一般来说,调试是任何语言的一个重要主题。 在任何编程语言中用于调试的一些其他主题包括shell重定向和信号处理。

最后,我意识到我使用的示例是微不足道的,但是一些shell脚本可以是数百行。 在这些情况下,我喜欢插入注释标记并阻止我怀疑有问题的代码,或者插入退出命令,并尝试使用分而治之的技术将function代码与破坏的代码隔离开来。