问题描述
有什么方法可以在不使用echo和logging的情况下调试bash脚本?
我说的是使用断点之类的东西。
最佳方案
是的,这里有Bash Debugger Project。
您还可以在执行时使用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
祝好运!
次佳方案
有几种不同的方法,即:
-
使用-x选项运行脚本
bash -x yourscript.sh
-
在Shebang
#!/bin/bash
之后且在脚本开始之前,在脚本文件的开头在新文件行中添加set -x
,set -v
将显示 shell 程序输入行,set -x
显示已执行的命令和参数 -
用
#!/bin/bash -xv
替换脚本文件的shebang
第三种方案
如今,这里有the Visual Studio Code Bash Debug extension。它具有’Step in/out/over’并可以显示每个变量的值。
第四种方案
shellcheck是该镇最好的-
您还可以与vim集成,这是git repo-
https://github.com/koalaman/shellcheck
第五种方案
您可以使用此小功能放入”console”:
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
它将接受任何命令,保持局部变量完整。要退出”debug”模式,请键入”exit”(不会退出脚本),它将继续执行代码。如果在循环内使用”debug”,它将每次停止。您可以将其包装在”if”中(如上例所示),或创建”watch”函数:
function debug_watch
{
if [[ $1 == $2 ]]; then
debug
fi
}
# And Use it:
debug_watch $FILE "strange_case.txt"
我还添加了”vars”命令,该命令将转储所有可用变量及其值。您也可以添加自己的自定义命令。
我在几分钟内完成了代码,因此使用时需要您自担风险。请注意,在调试模式下可以执行任何命令,因此,如果将其留在生产脚本中,则会带来安全隐患。