Home > Mobile >  Can I put a breakpoint in shell script?
Can I put a breakpoint in shell script?

Time:10-16

Is there a way to suspend the execution of the shell script to inspect the state of the environment or execute random commands?

CodePudding user response:

Bash or shell scripts do not have such debugging capabilities as other programming languages like Java, Python, etc.

We can put the echo "VAR_NAME=$VAR_NAME" command in the code where we want to log the variable value.

Also, a little bit more flexible solution is to put this code somewhere at the beginning in the shell script we want to debug:

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

and then later, at the line of code where we need to break we invoke this function like this:

# some shell script here
BREAKPOINT MyBreakPoint
# and some other shell script here

So then the BREAKPOINT function will log some output then launch /bin/bash where we can run any echo or some other shell command we want. When we want to continue running the rest of the shell script (release breakpoint) we just need to execute exit command. If we need to terminate script execution we would run exit 1 command.

CodePudding user response:

alias combined with eval gives you basic functionality of breakpoints in calling context:

#!/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

At the breakpoint, you can input

echo $var

followed by

var=2

then Ctrl-d to exit from breakpoint.

Due to eval in the while loop, use with caution.

  • Related