Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: [PATCHv2] [bug] $SHLVL decremented for the last command of a subshell

On Tue, 30 Aug 2016 20:34:34 +0200
Mikael Magnusson <mikachu@xxxxxxxxx> wrote:
> > When this was introduced in zsh, there was some controversy over whether
> > it was the right thing to do.  I decided it was on the basis that the
> > "level" is how deep you are in the process hierarchy, rather than how
> > many processes have previously been executed to get where you are,
> > seeing as the latter isn't really visible in the current context.
> > But I'm not aware of any requirement specification [remember those?]
> > saying what the purpose of SHLVL is.
> For me personally, I just use it in my prompt to indicate whether
> typing "exit" will close the terminal or not, eg if I'm inside a
> nested actual shell. When I added that I wasn't even aware of any of
> the weird rules regarding subshells affecting it. It's not immediately
> obvious to me when that is useful...

There are no weird *rules* regarding subshells and SHLVL; the rule is
SHLVL should indicate how deeply nested the parent shell is in process
terms.  The effect with subshells was a bug because we do a fake
exec (i.e. we don't bother forking for the new last command) with the
last process in a subshell because we know the current process
will come to an end anyway.

The decrement is needed in general on a real exec because you are
creating a new shell which isn't more deeply nested, i.e. if you do
"exec zsh" from the command line you (probably) expect SHLVL to look the
same since the nesting level hasn't changed. If everything is working
this is the sole effect (but process management is complicated enough
real life isn't necessarily that simple).

The final question was whether after the fix there was any remaining
business to do with the combination of execs and subshells, but it
doesn't look like there is anything significant.


Messages sorted by: Reverse Date, Date, Thread, Author