Home > Enterprise >  Bash `set -x` only for the duration of a function
Bash `set -x` only for the duration of a function

Time:11-22

I have a function that runs several commands and each of them take awhile to finish. I added set -x at the beginning so that I can see exactly which command is executing while it's running. Then at the end I disable it with set x.

function toolong() {
  set -x;
  takes_a_long_time &&\
  takes_also_a_long_time &&\ # <=== Hangs here, for example
  takes_more time
  set  x;
}

My problem is that sometimes I need to kill my process if one of the functions hangs or is taking too long. When that happens i'm left with a bunch of crap in my shell as set x never got called.

Is there a way to limit the scope of set -x only to the duration of a specific function or otherwise guarantee that set x always gets called?

CodePudding user response:

If you don't need to affect current execution environment, just run it all in a subshell.

toolong() {
  (
     set -x;
     takes_a_long_time &&
     takes_also_a_long_time &&
     takes_more time
  )
}

Or shorter you can:

toolong() (
  set -x;
  takes_a_long_time &&
  takes_also_a_long_time &&
  takes_more time
)

CodePudding user response:

You can define a trap for cleaning up when the function is interrupted:

trap '[[ $FUNCNAME == toolong ]] && set  x' INT

or systematically when using a CtrlC:

trap 'set  x' INT
  •  Tags:  
  • bash
  • Related