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
The recommended commands for modifying PATH
from fish's maintainers are:
If you want to run the command once:
set -Ua fish_user_paths /path
If you want to add a command to a startup script, this is idempotent:
contains /path $fish_user_paths; or set -Ua fish_user_paths /path
In order to set variables for shell config file
, I did as follows:
The main command to set any user specific variable is
set -Ua fish_user_paths /path/to/bin/directory/
set -Ux fish_user_paths /usr/local/bin
Run touch ~/.config/fish/config.fish
, unless it exists.
RUST
: set -Ua fish_user_paths $HOME/.cargo/bin
JAVA
: set -Ua fish_user_paths /path/to/java/bin
Node
& nvm
: make sure you have installed nvm
properly then
omf install nvm
set -gx NVM_DIR /path/to/nvm
Go
: set -Ua fish_user_paths /path/to/go/bin/
Scala
: set -Ua fish_user_paths /path/to/scala/bin/
Groovy
: set -Ua fish_user_paths /path/to/groovy/bin/
Maven
: set -Ua fish_user_paths /path/to/mvn/bin/
Gradle
: set -Ua fish_user_paths /path/to/groovy/bin/
Finally, refresh your terminal.
PS in some operating system (eg OpenSuse), drop a
.
1. Enumerate user paths:
echo $fish_user_paths | tr " " "\n" | nl
2. Append a new bin path, permanently:
set -ga fish_user_paths my_appended_path
3. Remove 7th bin search path by index: (see #1):
set —eg fish_user_paths[7]
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.
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 because the -U argument will make the variable universal.
From the fish
documentation:
... (Note: you should NOT add this line to
config.fish
. If you do, the variable will get longer each time you run fish!)fish_user_paths, a list of directories that are prepended to PATH. This can be a universal variable.