【发布时间】:2021-10-15 20:45:01
【问题描述】:
有没有办法暂停shell脚本的执行以检查环境状态或执行随机命令?
【问题讨论】:
标签: bash shell debugging breakpoints
有没有办法暂停shell脚本的执行以检查环境状态或执行随机命令?
【问题讨论】:
标签: bash shell debugging breakpoints
alias 结合eval 为您提供了调用上下文中断点的基本功能:
#!/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
在断点处,可以输入
echo $var
紧随其后
var=2
然后 Ctrl-d 从断点退出。
由于eval在while循环中,请谨慎使用。
【讨论】:
while 循环期间,您可能会保留当前的 FD 并将它们设置回 TTY。
Bash 或 shell 脚本没有像 Java、Python 等其他编程语言那样的调试功能。
我们可以将echo "VAR_NAME=$VAR_NAME" 命令放在我们想要记录变量值的代码中。
另外,更灵活一点的解决方案是将此代码放在我们要调试的 shell 脚本的开头:
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
因此,BREAKPOINT 函数将记录一些输出,然后启动 /bin/bash,我们可以在其中运行任何 echo 或我们想要的其他一些 shell 命令。当我们想继续运行 shell 脚本的其余部分(释放断点)时,我们只需要执行exit 命令。如果我们需要终止脚本执行,我们将运行exit 1 命令。
【讨论】: