debugging 我可以在shell脚本中放置断点吗?

eblbsuwk  于 2022-11-14  发布在  Shell
关注(0)|答案(3)|浏览(119)

是否有办法暂停shell脚本的执行以检查环境状态或执行随机命令?

ibps3vxo

ibps3vxo1#

aliaseval结合使用,可在调用上下文中提供断点的基本功能:

#!/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从断点退出。
由于while循环中存在eval,请谨慎使用。

bvn4nwqk

bvn4nwqk2#

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命令。

8wtpewkr

8wtpewkr3#

有一些类似bash-debug的解决方案。一个穷人的解决方案对我来说是交互式外壳。通过添加三行代码,你可以反思和修改变量,如下所示:
假设您有脚本test.bash
第一个
如果在第3行添加交互式环境,则可以查看并检查之前导出的变量:
第一次
如果你想看到交互式环境中的所有变量,你必须在脚本的序言中添加set -a,这样所有的变量和函数都会被导出:
第一个
请注意,您不能在交互式环境中更改变量。对我来说,唯一的解决方案是获得一个额外的变量脚本,它将在交互式环境之后获得
第一个

相关问题