On Thu, Feb 06, 2025 at 18:41:14 +0100, Phi wrote:
> I find the docco for return [n] not easy to interpret. Here is what can be
> read.
>
> return [n]
> Stop executing a shell function or sourced file and
> return the value specified by n to its caller.
> ...
> Any command associated with the RETURN trap is exe‐
> cuted before execution resumes after the function or
> script.
In the FUNCTIONS section, there is some additional wording:
All other aspects of the shell execution environment are identical be‐
tween a function and its caller with these exceptions: the DEBUG and
RETURN traps (see the description of the trap builtin under SHELL
BUILTIN COMMANDS below) are not inherited unless the function has been
given the trace attribute (see the description of the declare builtin
below) or the -o functrace shell option has been enabled with the set
builtin (in which case all functions inherit the DEBUG and RETURN
traps), and the ERR trap is not inherited unless the -o errtrace shell
option has been enabled.
> $ function f { :; }
> $ trap "echo catch return" RETURN
> $ . /dev/null # Hurray!
> catch return
The RETURN trap fired upon "returning" from a . command, because the
trap was set within the main script, not within the function f.
> $ f # huh ?
The RETURN trap was not inherited by the function f, because the function
was not "given the trace attribute", and the functrace shell option is not
enabled.
> $ shopt -s extdebug
> $ f # ha!
> catch return
I suppose extdebug must imply functrace, then.
> As any gurus out there knows the function return trap is only available with
> shopt -s extdebug, that is not explicitly stated in the documentation, and
> its a pain.
I guess I'm not a guru.
Anyway, based on the part of the documentation that I cited, the RETURN
trap seems to work fine if it's defined within the function.
hobbit:~$ f1() { echo f1; }
hobbit:~$ f2() { trap 'echo TRAP' RETURN; echo f2; }
hobbit:~$ f1
f1
hobbit:~$ f2
f2
TRAP
hobbit:~$ f1
f1
hobbit:~$ f2
f2
TRAP
If extdebug really does imply functrace, then that's missing from the
documentation. The rest appears to be working as intended.