#!/bin/bash
shopt -s expand_aliases
alias breakpoint='
while read -p"Debugging(Ctrl-d to exit)> " debugging_line
do
eval "$debugging_line"
done'
f(){
local var=1
breakpoint
echo $'\n'"After breakpoint, var=$var"
}
f
function BREAKPOINT() {
BREAKPOINT_NAME=$1
echo "Enter breakpoint $BREAKPOINT_NAME"
set +e
/bin/bash
BREAKPOINT_EXIT_CODE=$?
set -e
if [[ $BREAKPOINT_EXIT_CODE -eq 0 ]]; then
echo "Continue after breakpoint $BREAKPOINT_NAME"
else
echo "Terminate after breakpoint $BREAKPOINT_NAME"
exit $BREAKPOINT_EXIT_CODE
fi
}
export -f BREAKPOINT
然后,在需要中断的代码行处,调用此函数,如下所示:
# some shell script here
BREAKPOINT MyBreakPoint
# and some other shell script here
3条答案
按热度按时间ibps3vxo1#
alias
与eval
结合使用,可在调用上下文中提供断点的基本功能:在断点处,可以输入
紧接着
然后按Ctrl-d从断点退出。
由于while循环中存在
eval
,请谨慎使用。bvn4nwqk2#
Bash或shell脚本不具有像Java、Python等其他编程语言那样的调试功能。
我们可以将
echo "VAR_NAME=$VAR_NAME"
命令放在要记录变量值的代码中。另外,一个更灵活的解决方案是将此代码放在我们要调试的shell脚本的开头:
然后,在需要中断的代码行处,调用此函数,如下所示:
因此,BREAKPOINT函数将记录一些输出,然后启动
/bin/bash
,我们可以在其中运行任何echo
或其他我们想要的shell命令。当我们想继续运行shell脚本的其余部分(释放断点)时,我们只需要执行exit
命令。如果我们需要终止脚本执行,我们将运行exit 1
命令。8wtpewkr3#
有一些类似bash-debug的解决方案。一个穷人的解决方案对我来说是交互式外壳。通过添加三行代码,你可以反思和修改变量,如下所示:
假设您有脚本
test.bash
第一个
如果在第3行添加交互式环境,则可以查看并检查之前导出的变量:
第一次
如果你想看到交互式环境中的所有变量,你必须在脚本的序言中添加
set -a
,这样所有的变量和函数都会被导出:第一个
请注意,您不能在交互式环境中更改变量。对我来说,唯一的解决方案是获得一个额外的变量脚本,它将在交互式环境之后获得
第一个