mirror of
https://github.com/fish-shell/fish-shell.git
synced 2024-11-23 01:24:23 +08:00
e1d19cf571
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. |
||
---|---|---|
.. | ||
checks | ||
pexpects | ||
test_functions | ||
.gitignore | ||
history_sample_bash | ||
history_sample_corrupt1 | ||
history_sample_fish_1_x | ||
history_sample_fish_2_0 | ||
interactive.config | ||
interactive.fish | ||
test_util.fish | ||
test.fish |