【问题标题】:Can I put a breakpoint in shell script?我可以在 shell 脚本中设置断点吗?
【发布时间】:2021-10-15 20:45:01
【问题描述】:

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

【问题讨论】:

    标签: bash shell debugging breakpoints


    【解决方案1】:

    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循环中,请谨慎使用。

    【讨论】:

    • 如果 stdin/stdout/stderr 没有被重定向,这种方法将不起作用。在while 循环期间,您可能会保留当前的 ​​FD 并将它们设置回 TTY。
    • @psmears 脚本只是为了给出一个想法。需要做很多工作才能使其在实际情况下可用。
    • 很公平 - 只是指出没有意识到这个限制的人可能会很困惑:)
    【解决方案2】:

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

    【讨论】:

    猜你喜欢
    • 2018-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-11
    相关资源
    最近更新 更多