1

From How to echo shell commands as they are executed I've learned how to use set -v to print commands when they are executed. It works well if set -v is added at the beginning of foo.sh or bash -v foo.sh is run. However, if foo.sh invokes bar.sh by bash bar.sh or simply ./bar.sh, the commands in bar.sh are not printed. Is there a global switch that enables all the commands and functions, through all invoked scripts, to be printed when they are executed?

oguz ismail
  • 1
  • 16
  • 47
  • 69
ElpieKay
  • 27,194
  • 6
  • 32
  • 53

1 Answers1

8

Is there a global switch that enables all the commands and functions, through all invoked scripts, to be printed when they are executed?

Yes, BASH_ENV can be used for that. The manual describes it as follows.

If this variable is set when Bash is invoked to execute a shell script, its value is expanded and used as the name of a startup file to read before executing the script.

So, you can just put set -v in a file and assign its path to BASH_ENV while invoking the first script. For example:

$ cat env.sh
set -v
$
$ cat foo
#!/bin/bash
true
./bar
$
$ cat bar
#!/bin/bash
false
$ BASH_ENV=./env.sh ./foo
#!/bin/bash
true
./bar
#!/bin/bash
false

Alternatively, to do this without having to create an extra file, you can start the script with a fabricated SHELLOPTS value

# too long, and might require adjustments for future versions
env SHELLOPTS=braceexpand:hashall:interactive-comments:verbose ./foo

or, enable verboseness by the set command or by adding -v to the shebang and export SHELLOPTS within the first script.

set -v
# exports all options, not only `verbose'
export SHELLOPTS
# the rest of the script
oguz ismail
  • 1
  • 16
  • 47
  • 69