如何调试bash脚本?
有没有办法调试bash脚本而不使用echo和logging?
我在谈论使用断点和类似的东西。
是的,有Bash调试器项目 。
您还可以在执行时使用set -x
和set-v
。 这里和这里或这里有一些信息。
祝好运!
有几种不同的方式,即:
-
使用-x选项运行脚本
bash -x yourscript.sh
-
在Shebang
#!/bin/bash
之后的脚本文件开头的新行中添加set -x
在脚本开始之前,set -v
将显示shell输入行,set -x
显示已执行的命令和参数 -
用
#!/bin/bash -xv
替换脚本文件的shebang
shellcheck是镇上最好的 –
你也可以与vim集成,这里是git repo –
现在,有Visual Studio Code Bash Debug扩展 。 它具有“进/出/结束”function,可以显示每个变量的值。
你可以使用这个小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任务列表
- 书签列表
- 多窗口编辑
- 远程共享项目环境
脚本编辑器透视图:
调试透视图:
使用的步骤是将Shelled
和BashEclipse
插件添加到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
确定文件类型。 -
hexdump
filter,以各种格式显示指定的文件 -
nohup
运行一个不会挂起的脚本和许多其他人。 我试图想出显示隐藏字符的命令,但我现在无法做到。 Hexdump会做,但有一个更好的。
键命令ctrl \将导致正在运行的程序或脚本进行核心转储。 然后你可以分析coredump。 我可能会使用gdb来分析coredump,但是很多程序都存在。
bash shell也有一些漂亮的调试选项。 选项--debugger
, -v
verbose, – --dump-strings
和其他漂亮的选项来帮助你。 使用man bash
检查它们。
trap
命令(内置shell)对您非常有帮助。 陷阱说如果你的程序意外退出,执行一些事情。 您在这里阅读了有关陷阱和其他方便的Bash Shell内容。
一般来说,调试是任何语言的一个重要主题。 在任何编程语言中用于调试的一些其他主题包括shell重定向和信号处理。
最后,我意识到我使用的示例是微不足道的,但是一些shell脚本可以是数百行。 在这些情况下,我喜欢插入注释标记并阻止我怀疑有问题的代码,或者插入退出命令,并尝试使用分而治之的技术将function代码与破坏的代码隔离开来。