Fish config interactiveShellInit, repeated PATH, solution found

I am using fish with nixos and always had something weird happen

programs.fish.interactiveShellInit = ''
    set PATH $PATH:/etc/nixos/bin:~/.local/bin:~/.cargo/bin
'';

(note: this is wrong fish syntax)

this would repeat the path over and over, between every other occurrence

echo $PATH
/run/wrappers/bin ~/.cargo/bin ~/.local/bin ~/.cargo/bin /etc/nixos/bin ~/.cargo/bin ~/.cargo/bin ~/.cargo/bin /home/user/.local/share/flatpak/exports/bin ~/.cargo/bin ~/.local/bin ~/.cargo/bin /etc/nixos/bin ~/.cargo/bin ~/.cargo/bin ~/.cargo/bin /var/lib/flatpak/exports/bin ~/.cargo/bin ~/.local/bin ~/.cargo/bin /etc/nixos/bin ~/.cargo/bin ~/.cargo/bin ~/.cargo/bin /home/user/.nix-profile/bin ~/.cargo/bin ~/.local/bin ~/.cargo/bin /etc/nixos/bin ~/.cargo/bin ~/.cargo/bin ~/.cargo/bin /nix/profile/bin ~/.cargo/bin ~/.local/bin ~/.cargo/bin /etc/nixos/bin ~/.cargo/bin ~/.cargo/bin ~/.cargo/bin /home/user/.local/state/nix/profile/bin ~/.cargo/bin ~/.local/bin ~/.cargo/bin /etc/nixos/bin ~/.cargo/bin ~/.cargo/bin ~/.cargo/bin /etc/profiles/per-user/user/bin ~/.cargo/bin ~/.local/bin ~/.cargo/bin /etc/nixos/bin ~/.cargo/bin ~/.cargo/bin ~/.cargo/bin /nix/var/nix/profiles/default/bin ~/.cargo/bin ~/.local/bin ~/.cargo/bin /etc/nixos/bin ~/.cargo/bin ~/.cargo/bin ~/.cargo/bin /run/current-system/sw/bin ~/.cargo/bin ~/.local/bin ~/.cargo/bin /etc/nixos/bin ~/.cargo/bin ~/.cargo/bin ~/.cargo/bin

then I changed it to this, which fixed it

programs.fish.interactiveShellInit = ''
   fish_add_path /etc/nixos/bin ~/.cargo/bin
'';
echo $PATH
/home/user/.cargo/bin /etc/nixos/bin /run/wrappers/bin /home/user/.local/share/flatpak/exports/bin /var/lib/flatpak/exports/bin /home/user/.nix-profile/bin /nix/profile/bin /home/user/.local/state/nix/profile/bin /etc/profiles/per-user/user/bin /nix/var/nix/profiles/default/bin /run/current-system/sw/bin

anyone know why this happened?


For anyone interested in configuring fish, I put all custom functions in the interactiveShellInit and use environment.shellAliases to get aliases in all shells.

$PATH in fish is an array, so what you’ve done is append :/etc/nixos/bin:~/.local/bin:~/.cargo/bin to each element of the original PATH array set that to the new PATH. As well as fish_add_path, you could do either

set PATH $PATH /etc/nixos/bin ~/.local/bin ~/.cargo/bin # Treat $PATH as an array

or

# Use quotes which convert PATH into a colon separated string
set PATH "$PATH:/etc/nixos/bin:~/.local/bin:~/.cargo/bin
1 Like

that explains a lot!