UAdapter Asked: 2011-01-12 14:18:29 +0800 CST2011-01-12 14:18:29 +0800 CST 2011-01-12 14:18:29 +0800 CST 如何调试 bash 脚本? 772 有什么方法可以在不使用 echo 和 logging 的情况下调试 bash 脚本? 我说的是使用断点之类的东西。 bash 7 个回答 Voted NES 2011-01-12T14:40:15+08:002011-01-12T14:40:15+08:00 有几种不同的方法,即: 使用 -x 选项运行脚本 bash -x yourscript.sh set -x在 Shebang 之后#!/bin/bash和脚本开头之前在脚本文件的开头添加一个新行,set -v将显示 shell 输入行,set -x显示执行的命令和参数 将脚本文件的 shebang 替换为#!/bin/bash -xv Best Answer danizmax 2011-01-12T14:44:41+08:002011-01-12T14:44:41+08:00 是的,有Bash 调试器项目。 您也可以在执行时使用set -x和。set -v更多信息: http://www.linuxtopia.org/online_books/advanced_bash_scripting_guide/debugging.html http://www.cyberciti.biz/tips/debugging-shell-script.html 祝你好运! Henrique Lemos Ribeiro 2017-02-23T11:55:01+08:002017-02-23T11:55:01+08:00 如今,有Visual Studio Code Bash 调试扩展。它具有“步入/退出/结束”,可以显示每个变量的值。 ramgorur 2015-05-15T22:09:44+08:002015-05-15T22:09:44+08:00 shellcheck是镇上最好的—— http://www.shellcheck.net/ 你也可以与 vim 集成,这里是 git repo -- https://github.com/koalaman/shellcheck lepe 2015-05-15T21:47:18+08:002015-05-15T21:47:18+08:00 您可以使用这个小功能进入“控制台”: 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”(它不会退出脚本),它将继续执行代码。如果你在循环中使用“调试”,它每次都会停止。您可以将其包装在“if”中(如上例所示),或创建“watch”函数: function debug_watch { if [[ $1 == $2 ]]; then debug fi } # And Use it: debug_watch "$file" "strange_case.txt" 我还添加了“vars”命令,它将转储所有可用的变量及其值。您也可以添加自己的自定义命令。 我在几分钟内完成了代码,所以使用它需要您自担风险。请注意,在调试模式下,任何命令都可以执行,因此如果将其留在生产脚本中会带来安全风险。 j0h 2014-04-26T17:43:03+08:002014-04-26T17:43:03+08:00 根据 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实际上有很多功能,但遗憾的是没有手册页,因为它是一个 shell 内置工具。set 的手册在GNU Bash 文档中。 有许多命令行工具可以帮助您获得有关程序的详细信息,例如: stat 显示文件或文件系统状态 file 确定文件类型。 hexdump 以多种格式显示指定文件的过滤器 nohup 运行不会挂起的脚本 和许多其他人。我试图想到显示隐藏字符的命令,但我现在做不到。Hexdump 会做到这一点,但有一个更好的。 关键命令ctrl\将导致正在运行的程序或脚本进行核心转储。然后你可以分析核心转储。我可能会使用 gdb 来分析核心转储,但是为此存在许多程序。 bash shell 也有一些不错的调试选项。options --debugger,-vverbose--dump-strings和其他漂亮的选项来帮助你。使用man bash. 该trap命令(内置 shell)可能对您非常有帮助。陷阱说如果你的程序意外退出,执行一些东西。您在此处阅读了陷阱和其他方便的 Bash Shell 内置函数。 就目前而言,调试在任何语言中都是一个巨大的话题。可以方便地使用任何编程语言进行调试的其他一些主题包括 shell 重定向和信号处理。 最后,我意识到我使用的示例是微不足道的,但一些 shell 脚本可能有数百行。在这些情况下,我喜欢插入注释标签并阻止我怀疑有错误的代码,或者插入退出命令,并尝试使用分而治之的技术将功能代码与损坏的代码隔离开来。 L. D. James 2016-08-19T00:22:46+08:002016-08-19T00:22:46+08:00 用于调试 bash 脚本的 GUI 选项是带有 BashEclipse/Shelled 插件的 Eclipse IDE。 这提供了您的问题 ( breakpoints and stuff) 的功能以及用于调试复杂 bash 脚本的许多其他功能。 一些功能包括 :(https://unix.stackexchange.com/questions/155551/how-to-debug-a-bash-script) 断点切换 单步操作 Step-in, Step-out, Step-over 功能和子程序 在脚本运行时随时检查代码变量 TODO 任务列表 书签列表 多窗口编辑 项目环境远程共享 脚本编辑器透视图: 调试视角: 使用步骤是在eclipse中添加Shelled和插件。BashEclipse然后运行 BashEclipse read me 文本文件中提供的程序来启动调试器。
有几种不同的方法,即:
使用 -x 选项运行脚本
set -x
在 Shebang 之后#!/bin/bash
和脚本开头之前在脚本文件的开头添加一个新行,set -v
将显示 shell 输入行,set -x
显示执行的命令和参数将脚本文件的 shebang 替换为
#!/bin/bash -xv
是的,有Bash 调试器项目。
您也可以在执行时使用
set -x
和。set -v
更多信息:http://www.linuxtopia.org/online_books/advanced_bash_scripting_guide/debugging.html http://www.cyberciti.biz/tips/debugging-shell-script.html
祝你好运!
如今,有Visual Studio Code Bash 调试扩展。它具有“步入/退出/结束”,可以显示每个变量的值。
shellcheck是镇上最好的——
http://www.shellcheck.net/
你也可以与 vim 集成,这里是 git repo --
https://github.com/koalaman/shellcheck
您可以使用这个小功能进入“控制台”:
然后,在您的脚本中(示例):
它将接受任何命令,保持局部变量不变。要退出“调试”模式,请键入“exit”(它不会退出脚本),它将继续执行代码。如果你在循环中使用“调试”,它每次都会停止。您可以将其包装在“if”中(如上例所示),或创建“watch”函数:
我还添加了“vars”命令,它将转储所有可用的变量及其值。您也可以添加自己的自定义命令。
我在几分钟内完成了代码,所以使用它需要您自担风险。请注意,在调试模式下,任何命令都可以执行,因此如果将其留在生产脚本中会带来安全风险。
根据 NES 所说的,在 bash 中有设置标志以允许调试。
set -x
可以从终端或脚本中设置和取消设置标志。使用+
或-
:以下是
set
命令的作用:set -f
禁用使用元字符生成文件名。set -v
在读取时打印(详细)shell 输入行。set -x
在执行命令之前打印命令跟踪。set
实际上有很多功能,但遗憾的是没有手册页,因为它是一个 shell 内置工具。set 的手册在GNU Bash 文档中。有许多命令行工具可以帮助您获得有关程序的详细信息,例如:
stat
显示文件或文件系统状态file
确定文件类型。hexdump
以多种格式显示指定文件的过滤器nohup
运行不会挂起的脚本和许多其他人。我试图想到显示隐藏字符的命令,但我现在做不到。Hexdump 会做到这一点,但有一个更好的。
关键命令ctrl\将导致正在运行的程序或脚本进行核心转储。然后你可以分析核心转储。我可能会使用 gdb 来分析核心转储,但是为此存在许多程序。
bash shell 也有一些不错的调试选项。options
--debugger
,-v
verbose--dump-strings
和其他漂亮的选项来帮助你。使用man bash
.该
trap
命令(内置 shell)可能对您非常有帮助。陷阱说如果你的程序意外退出,执行一些东西。您在此处阅读了陷阱和其他方便的 Bash Shell 内置函数。就目前而言,调试在任何语言中都是一个巨大的话题。可以方便地使用任何编程语言进行调试的其他一些主题包括 shell 重定向和信号处理。
最后,我意识到我使用的示例是微不足道的,但一些 shell 脚本可能有数百行。在这些情况下,我喜欢插入注释标签并阻止我怀疑有错误的代码,或者插入退出命令,并尝试使用分而治之的技术将功能代码与损坏的代码隔离开来。
用于调试 bash 脚本的 GUI 选项是带有 BashEclipse/Shelled 插件的 Eclipse IDE。
这提供了您的问题 (
breakpoints and stuff
) 的功能以及用于调试复杂 bash 脚本的许多其他功能。一些功能包括
:(https://unix.stackexchange.com/questions/155551/how-to-debug-a-bash-script)
脚本编辑器透视图:
调试视角:
使用步骤是在eclipse中添加
Shelled
和插件。BashEclipse
然后运行 BashEclipse read me 文本文件中提供的程序来启动调试器。