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?
Asked
Active
Viewed 711 times
1

oguz ismail
- 1
- 16
- 47
- 69

ElpieKay
- 27,194
- 6
- 32
- 53
1 Answers
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