I'm currently playing around with the fish shell and I'm having some trouble wrapping my head around how the PATH
variable is set. For what it's worth, I'm also using oh-my-fish.
If I echo my current path I get:
➜ fish echo $PATH
/usr/local/bin /usr/bin /bin /usr/sbin /sbin /usr/local/bin /opt/X11/bin /usr/texbin /Users/myname/.opam/system/bin
Looking at ~/.config/fish/config.fish
I see the following line
set PATH /usr/local/bin $PATH /Users/myname/.opam/system/bin
My question is (and this phrasing will probably reflect my lack of knowledge on the subject): prior to config.fish
being processed, where is the PATH
variable set? ie: where do all of the paths between /usr/local/bin
and /Users/myname/.opam/system/bin
come from?
As stated in the official fish tutorial, you can modify the $fish_user_paths
universal variable.
Run the following once from the command-line:
set -U fish_user_paths /usr/local/bin $fish_user_paths
This will prepend /usr/local/bin
permanently to your path, and will affect the current session and all future instances too.
Do not add this line to your config.fish
file, as it would cause the $fish_user_paths
to grow with each shell instance.
Like all shells, fish inherits its PATH from the environment it is started in. How this is set for login shells differs between operating systems - on Linux, for example, /etc/login.defs
controls the initial PATH set for all login shells. I don't know how this is set on OS X.
Next, like bash
or csh
, the initialisation files for the shell may alter the path. For fish on OS X, there is code in share/fish/config.fish
to load paths from the standard OS X path configuration files /etc/paths
and /etc/paths.d/*
. There is alternative code to set a useful path on Solaris.
There is also code to pick up paths from the universal variable $fish_user_paths
, which is the right way to add something to your PATH and have it reflected across all shells.