mirror of
https://github.com/fish-shell/fish-shell.git
synced 2026-05-08 08:01:15 -03:00
Don't touch $SHLVL if not interactive
It's not super clear what $SHLVL is useful for, but the current definition is essentially "number of shells in the parent processes + 1" which isn't *super useful*? Bash's behavior here is a bit weird in that it increments $SHLVL basically always, but since it auto-execs the last process it will decrement it again, so in practice it's often not incremented. E.g. ``` > echo $SHLVL 1 > bash -c 'echo $SHLVL; bash' 2 >> echo $SHLVL 2 ``` Both bashes here end up having the same $SHLVL because this is equivalent to `echo $SHLVL; exec bash`. Running `echo $SHLVL` and then `bash -c 'echo $SHLVL'` in an interactive bash will have a different result (1 and 2) because that doesn't *exec* the inner bash. That's not something we want to get into, so what we do is increment $SHLVL in every interactive fish. Non-interactive fish will simply import the existing value. That means if you had e.g. a bash that runs a fish script that ends up opening a new fish session, you would have a $SHLVL of *2* - one for the bash, and one for the inner fish. We key this off is_interactive_session() (which can also be enabled via `fish -i`) because it's easy and because `fish -i` is asking for fish to be, in some form, "interactive". That means most of the time $SHLVL will be "how many shells am I deep, how often do I have to `exit`", except for when you specifically asked for a fish to be "interactive". If that's a problem, we can rethink it. Fixes #7864.
This commit is contained in:
@@ -1248,7 +1248,7 @@ Fish also provides additional information through the values of certain environm
|
||||
|
||||
- ``pipestatus``, a list of exit statuses of all processes that made up the last executed pipe.
|
||||
|
||||
- ``SHLVL``, the level of nesting of shells.
|
||||
- ``SHLVL``, the level of nesting of shells. Fish increments this in interactive shells, otherwise it simply passes it along.
|
||||
|
||||
- ``status``, the `exit status <#variables-status>`_ of the last foreground job to exit. If the job was terminated through a signal, the exit status will be 128 plus the signal number.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user