terminal: Skip SHLVL when loading login shell environment#46273
Merged
Veykril merged 1 commit intozed-industries:mainfrom Jan 8, 2026
Merged
terminal: Skip SHLVL when loading login shell environment#46273Veykril merged 1 commit intozed-industries:mainfrom
Veykril merged 1 commit intozed-industries:mainfrom
Conversation
Fixes #33958 PR #44835 attempted to fix SHLVL starting at 2 by removing it from the env HashMap passed to alacritty. However, that HashMap is only an overlay - alacritty uses the parent process environment as a base and applies the overlay on top. Since alacritty never calls env_remove("SHLVL"), the terminal shell still inherits SHLVL from Zed's process environment. The root cause is that load_login_shell_environment() captures env vars from a login shell (which increments SHLVL) and writes them to Zed's process environment. When a terminal is opened, the shell inherits this already-incremented SHLVL and increments it again. This fix skips SHLVL when setting Zed's process environment, preventing the login-shell capture from polluting it. Terminals now start with the correct SHLVL.
Contributor
baldwindavid
added a commit
to baldwindavid/zed
that referenced
this pull request
Jan 8, 2026
* main: (349 commits) component_preview: Fix license symlink (zed-industries#46379) Do not react on already observed buffer edits' versions (zed-industries#46308) Fix EP CLI output flicker (zed-industries#46313) vim: Fix bug where repeat operator could lead to unrecoverable replaying state (zed-industries#46376) vim: Implement text-based matching bracket logic for Vim '%' motion to correctly find pairs within comments (zed-industries#45559) Improve LSP button error message (zed-industries#46377) agent: Make reject/accept keybindings consistent with restore/stage (zed-industries#46373) Enable test-support features for some dev dependencies (zed-industries#46370) Capture terminal output when thread is interrupted (zed-industries#46306) Inline assistant tools: no more feature flag (zed-industries#46107) Add `ep split` subcommand for dataset splitting (zed-industries#46364) lsp_button: Fix long LSP version label (zed-industries#46359) remote: Introduce a proper mock remote connection (zed-industries#46337) ep: Allow matching patches against files without trailing newlines (zed-industries#46357) docs: Update "Custom Keybindings for Extension-Based Agents section" to include a troubleshooting note for defining an agent name (zed-industries#46144) Fail early if clangd is downloaded on aarch Linux (zed-industries#46346) ep: Handle errored requests in Anthropic batches (zed-industries#46351) settings_ui: Fix settings search missing results when BM25 finds partial matches (zed-industries#46349) workspace: Unpreview active tab when closing other tabs (zed-industries#46294) terminal: Skip SHLVL when loading login shell environment (zed-industries#46273) ...
rtfeldman
pushed a commit
that referenced
this pull request
Jan 9, 2026
Fixes #33958 ## Problem PR #44835 attempted to fix SHLVL starting at 2 by removing it from the `env` HashMap passed to alacritty. However, that HashMap is only an **overlay** — alacritty uses the parent process environment as a base and applies the overlay on top. Since alacritty never calls `env_remove("SHLVL")`, the terminal shell still inherits `SHLVL` from Zed's process environment. ## Root Cause The real issue is in `load_login_shell_environment()`: 1. `shell_env::capture()` spawns a login shell to capture environment variables 2. That login shell increments `SHLVL` (from 0→1 or n→n+1) 3. The captured env (including the incremented `SHLVL`) is written to Zed's **process environment** via `env::set_var` 4. When you open a terminal, the shell inherits Zed's `SHLVL` and increments it again → starts at 2 5. On reload, `shell_env::capture()` runs again with the already-elevated `SHLVL`, incrementing it further → +2 per reload ## Fix Skip `SHLVL` when setting Zed's process environment in `load_login_shell_environment()`. This prevents the login-shell capture from polluting Zed's env, so terminals start fresh with the correct `SHLVL`.
I was reading through the change log and noticed that this bug still exists? version log # in native terminal
❯ echo $SHLVL
1
# open zed
❯ zed .
# inside zed, opened a new terminal
❯ echo $SHLVL
2
# cmd+shift+p: run "workspace: reload" command
# run it again, it's ever increasing.
❯ echo $SHLVL
3nvm it seems people already reported this in #33958 (comment) |
LivioGama
pushed a commit
to LivioGama/zed
that referenced
this pull request
Jan 20, 2026
…ries#46273) Fixes zed-industries#33958 ## Problem PR zed-industries#44835 attempted to fix SHLVL starting at 2 by removing it from the `env` HashMap passed to alacritty. However, that HashMap is only an **overlay** — alacritty uses the parent process environment as a base and applies the overlay on top. Since alacritty never calls `env_remove("SHLVL")`, the terminal shell still inherits `SHLVL` from Zed's process environment. ## Root Cause The real issue is in `load_login_shell_environment()`: 1. `shell_env::capture()` spawns a login shell to capture environment variables 2. That login shell increments `SHLVL` (from 0→1 or n→n+1) 3. The captured env (including the incremented `SHLVL`) is written to Zed's **process environment** via `env::set_var` 4. When you open a terminal, the shell inherits Zed's `SHLVL` and increments it again → starts at 2 5. On reload, `shell_env::capture()` runs again with the already-elevated `SHLVL`, incrementing it further → +2 per reload ## Fix Skip `SHLVL` when setting Zed's process environment in `load_login_shell_environment()`. This prevents the login-shell capture from polluting Zed's env, so terminals start fresh with the correct `SHLVL`.
LivioGama
pushed a commit
to LivioGama/zed
that referenced
this pull request
Jan 20, 2026
…ries#46273) Fixes zed-industries#33958 ## Problem PR zed-industries#44835 attempted to fix SHLVL starting at 2 by removing it from the `env` HashMap passed to alacritty. However, that HashMap is only an **overlay** — alacritty uses the parent process environment as a base and applies the overlay on top. Since alacritty never calls `env_remove("SHLVL")`, the terminal shell still inherits `SHLVL` from Zed's process environment. ## Root Cause The real issue is in `load_login_shell_environment()`: 1. `shell_env::capture()` spawns a login shell to capture environment variables 2. That login shell increments `SHLVL` (from 0→1 or n→n+1) 3. The captured env (including the incremented `SHLVL`) is written to Zed's **process environment** via `env::set_var` 4. When you open a terminal, the shell inherits Zed's `SHLVL` and increments it again → starts at 2 5. On reload, `shell_env::capture()` runs again with the already-elevated `SHLVL`, incrementing it further → +2 per reload ## Fix Skip `SHLVL` when setting Zed's process environment in `load_login_shell_environment()`. This prevents the login-shell capture from polluting Zed's env, so terminals start fresh with the correct `SHLVL`.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #33958
Problem
PR #44835 attempted to fix SHLVL starting at 2 by removing it from the
envHashMap passed to alacritty. However, that HashMap is only an overlay — alacritty uses the parent process environment as a base and applies the overlay on top. Since alacritty never callsenv_remove("SHLVL"), the terminal shell still inheritsSHLVLfrom Zed's process environment.Root Cause
The real issue is in
load_login_shell_environment():shell_env::capture()spawns a login shell to capture environment variablesSHLVL(from 0→1 or n→n+1)SHLVL) is written to Zed's process environment viaenv::set_varSHLVLand increments it again → starts at 2shell_env::capture()runs again with the already-elevatedSHLVL, incrementing it further → +2 per reloadFix
Skip
SHLVLwhen setting Zed's process environment inload_login_shell_environment(). This prevents the login-shell capture from polluting Zed's env, so terminals start fresh with the correctSHLVL.