devbox icon indicating copy to clipboard operation
devbox copied to clipboard

How is PATH populated in devbox shell?

Open andbleo opened this issue 1 year ago • 3 comments

What happened?

I am trying to understand how the PATH env var is set when invoking devbox shell. Specifically, if I update PATH in my .zshrc (like when doing source "$HOME/.cargo/env", which updates the PATH), it isn't reflected in the PATH in my devbox shell. If I instead set PATH in my .profile, it is included in the PATH in my devbox shell. I was initially confused by this because my .zshrc is sourced by devbox shell (I see other env vars exported and a simple echo Testing 1 2 3 in my .zshrc is printed) so I incorrectly assumed it was updating my PATH based on the value sourced from .zshrc.

I'm fine with moving my updates to PATH from .zshrc to .profile to make this work, but it would be great to see the following:

  1. Document somewhere how PATH is set (if it isn't already)
  2. Document if there are any other env vars that get special treatment like PATH (if any)

Steps to reproduce

  1. update the PATH env var in .zshrc
  2. devbox shell
  3. echo $PATH and see that my updates to PATH from .zshrc aren't there

Command

shell

devbox.json

No response

Devbox version

0.13.6

Nix version

2.24.6

What system does this bug occur on?

Linux (x86-64)

Debug logs

No response

andbleo avatar Nov 14 '24 05:11 andbleo

hey there, i can't reproduce this. for me everything is working fine using zsh. eg i have this in my .zshrc:

path+=('/usr/local/go/bin')
export PATH

and then in a devbox shell running echo $PATH i see the path at the very.

truearken avatar Nov 16 '24 16:11 truearken

I think I have narrowed down where the issue occurs. I have the following line in my .zshrc: eval "$(devbox global shellenv --init-hook)"

If I append to PATH before that command, my changes to PATH show up when I enter a devbox shell, but they don't show up if I append to PATH after that command.

I'm not sure why that command is interfering with the PATH for non-global devbox shells.

andbleo avatar Nov 19 '24 04:11 andbleo

I just encountered this exact same behaviour with bash, and it is very confusing. From looking at the output of devbox global shellenv I see exports of DEVBOX_INIT_PATH, DEVBOX_NIX_ENV_PATH_{hash} and DEVBOX_PATH_STACK and I suspect that these are later read by devbox shell in order to maintain correct path ordering of the users initial path, the devbox global path, and the project-local devbox path.

In any case, the solution seems to be as you described, make sure that eval "$(devbox global shellenv --init-hook)" comes after any other changes to PATH.

grncdr avatar Jul 03 '25 07:07 grncdr