有没有不使用 echo 和日志记录的方法来调试 bash 脚本?
我正在谈论使用断点和类似的东西。
答案1
有几种不同的方法,例如:
使用 -x 选项运行脚本
bash -x yourscript.sh
set -x
在脚本文件开头的 Shebang 之后#!/bin/bash
和脚本开头之前添加一个新行,set -v
将显示 shell 输入行,set -x
显示已执行的命令和参数用以下代码替换脚本文件
#!/bin/bash -xv
答案2
就在这里Bash 调试器项目。
您还可以在执行时使用set -x
and set -v
。更多信息:
http://www.linuxtopia.org/online_books/advanced_bash_scripting_guide/debugging.html http://www.cyberciti.biz/tips/debugging-shell-script.html
祝你好运!
答案3
如今,Visual Studio Code Bash 调试扩展. 它具有“Step in/out/over”功能并且可以显示每个变量的值。
答案4
您可以使用这个小功能进入“控制台”:
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”命令,它将转储所有可用变量及其值。您也可以添加自己的自定义命令。
我花了几分钟编写了代码,因此使用它时请自担风险。请注意,在调试模式下可以执行任何命令,因此如果您将其留在生产脚本中,则会带来安全风险。