Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

PATH support doesn't work for fish shell #478

Closed
brson opened this issue May 17, 2016 · 42 comments · Fixed by #3108 · May be fixed by #2995
Closed

PATH support doesn't work for fish shell #478

brson opened this issue May 17, 2016 · 42 comments · Fixed by #3108 · May be fixed by #2995

Comments

@brson
Copy link
Contributor

brson commented May 17, 2016

It's a popular shell and doesn't read .profile. cc @nagisa cc #468

@nagisa
Copy link
Member

nagisa commented May 24, 2016

Many linuxes should be covered by putting the environment to both ~/.pam_environment and ~/.profile, though it is a bag of worms because either or both can be disabled, not run or configured to be in another, non-standard location (i.e. not $HOME/.file).

For OS X it seems like you’d want to also inform launchd about the updated path with launchctl setenv PATH $PATH after setting the environment variable in any of the files.

Either way this goes, fixing #473 is another thing that would fix a lot of the problem here, since both /usr/local or ~/local/, where I’d like to have rustup be, are already in my path.

@snheath
Copy link

snheath commented May 26, 2016

FWIW OCaml's opam has a similar problem and handles it just by having a version of the add-stuff-to-PATH hook for each shell. There's also the "eval (opam config env)" idiom which sets the appropriate environment variables to point to wherever opam thinks they need to point to, including PATH. So a solution like that might work well.

@ariasuni
Copy link

ariasuni commented Sep 26, 2016

rustup create env with export PATH="$HOME/.cargo/bin:$PATH". Why not simply also create a file env.fish (like opam) with set -gx PATH "$HOME/.cargo/bin" $PATH;?

@robey
Copy link

robey commented Mar 4, 2017

this still doesn't work. ~/.cargo/env is completely wrong.

@icefoxen
Copy link

icefoxen commented Mar 5, 2017

I think you can just drop the set -gx ... command in a file in ~/.config/fish/conf.d/, see http://fishshell.com/docs/current/index.html#initialization

@chriswoollard
Copy link

I have had this issue a few times. It is easy to resolve.

Create a fish config file in the below directory, if it doesn't already exist.

~/.config/fish/config.fish

Then add the following line to the file.

export PATH="$HOME/.cargo/bin:$PATH"

Once you restart your terminal, the rust commands should work again.

@ndac-todoroki
Copy link

Exporting in a more fisher way

set PATH $HOME/.cargo/bin $PATH

in ~/.config/fish/config.fish maybe better.

@mojotx
Copy link

mojotx commented Sep 26, 2019

An even more fishier way would be to use the fish_user_paths universal variable.

Example:
set -U fish_user_paths $HOME/.cargo/bin $fish_user_paths

No need to mess with config files. A universal variable, once set, is permanently and persistently set across all fish shell sessions. The contents of that variable are automatically prepended to the $PATH environment variable.

@clearnote01
Copy link

Hi, any update with this, I think it's confusing that the script doesn't even at least mention this issue, nor is it mentioned with the documentation. I believe it's worthwhile to make change in the installation script to correctly handle for fish.

@kinnison
Copy link
Contributor

Unfortunately nobody who works on rustup uses fish so we're not really in a position to know if anything we do would be right. I've labelled this E-mentor because I'm prepared to assist someone who knows fish to prepare a PR, but I simply don't know the right things to do. If you want to help solve this, I'm around either on this issue, or on the Rust discord in #wg-rustup

@nagisa
Copy link
Member

nagisa commented Dec 23, 2019

As I commented above, we probably want to solve this is in a way that’s shell-independent. On linux that’d be .pam_environment and on macOS we’d use launchctl.

This will only become more relevant as people start experimenting and depending more with non-POSIX shells such as nushell or powershell. We cannot possibly hope to handle all these different shells in a shell-specific manner.

@clearnote01
Copy link

Python virtualenv module does handle each shell in shell-specific manner. It has a similar problem to set environment variables for these different shells. For Unixy systems they have multiple versions of this activate script to support fish along with csh and bash/zsh.

At least for linux there are some problems with ~/.pam_environment. Currently it doesn't seem to be read by WSL bash - issue here.

Another, problem is that there seems to be a need to re-login after making changes in ~/.pam_environment, as per following:

Suitable files for environment variable settings that should affect just a particular user (rather than the system as a whole) are ~/.pam_environment and ~/.profile. After having edited one of those files, you should re-login in order to initialize the variables.

https://help.ubuntu.com/community/EnvironmentVariables

@icefoxen
Copy link

icefoxen commented Dec 29, 2019

@kinnison I use fish and am happy to try digging into Rustup if someone can point me in the right direction.

Realistically there seems to be only a small handful of non-POSIX shells people actually use, and once support is implemented it probably won't need much in the way of maintenance.

@kinnison
Copy link
Contributor

@icefoxen Hi, I'm glad that you're interested in helping. Just before the holidays, @clearnote01 (I believe) was looking into things, so it may be best to join forces with them. If they've run out of energy for the work, perhaps you might help bring it over the line.

@lordlycastle
Copy link

So any progress? Also why not use /etc/profile which is read by shell independent?

@kinnison
Copy link
Contributor

I believe @workingjubilee is looking at shell support so it's possible Fish may come later from their work. We won't touch /etc/profile because that's global and rustup is a user-local installer. Also, if fish reads /etc/profile why doesn't it also read ~/.profile ?

@max-sixty
Copy link

max-sixty commented Jul 22, 2020

FYI fish does not read any profile files

Source: fish-shell/fish-shell#3665

@workingjubilee
Copy link
Contributor

I recommend that because fish sessions are persisted that we detect fish during setup and direct the user to simply run the command which sets PATH appropriately, possibly after writing a fish script to make it easy.

@aadibajpai
Copy link

aadibajpai commented Nov 2, 2020

I would recommend simply running set -Ua fish_user_paths $HOME/.cargo/bin if on fish.¹ It persistently adds the cargo path to path and does not require modifying any file(s).

[1] fish-shell/fish-shell#527 (comment)

@TylerYep
Copy link

TylerYep commented Nov 9, 2020

I still had some issues even after trying set -Ua fish_user_paths $HOME/.cargo/bin, so instead I added the line source $HOME/.cargo/env to my config.fish file, which worked!

@aadibajpai
Copy link

fwiw, poetry installation which is also very similar to rustup does it like that as well https://github.com/python-poetry/poetry/blob/cc195f1dd086d1c4d12a3acc8d6766981ba431ac/get-poetry.py#L256

@wenwen12345
Copy link

wenwen12345 commented Feb 23, 2022

即使在尝试之后我仍然遇到一些问题set -Ua fish_user_paths $HOME/.cargo/bin,所以我将这一行添加source $HOME/.cargo/env到我的config.fish文件中,这有效!

~/.cargo/env (line 4): 'case' builtin not inside of switch block
case ":${PATH}:" in
^
from sourcing file ~/.cargo/env
called on line 6 of file ~/.config/fish/config.fish
from sourcing file ~/.config/fish/config.fish
called during startup
source: Error while reading file '/Users/lw/.cargo/env'
It don't work

@wenwen12345
Copy link

I add the $HOME/.cargo/bin in my /etc/paths, it works.

@freakydude
Copy link

freakydude commented Feb 28, 2022

Create a new fish config file (or use an existing one). Here for example pathvars under:

nano ~/.config/fish/conf.d/pathvars

and add

if status --is-login
    set -gx PATH $PATH ~/.cargo/bin
end

login/logout

@lordlycastle
Copy link

Just want to say that’s not the most fishy of achieving that. You can use the fish_user_path variable or even easier use the utility function fish_add_user_path. 😌

@ehartford
Copy link

setting a path manually should be within the skillset of a fish user. and if not - frankly, they should use bash.

@lordlycastle
Copy link

lordlycastle commented Mar 18, 2022

I don’t think people want this feature because it is too difficult to set the path var.

It is the not knowing what to do to fix the issue. If they know they should add to path after install then it should tell the user about it.

Things should be obvious so you can service all types of users and not gatekeep because it makes you feel like hackerman.

neko314 added a commit to neko314/dotfiles that referenced this issue May 1, 2022
@Elmer-Almeida
Copy link

For people stumbling across it later on. Newer fish versions have a new builtin command for appending to a path:

fish_add_path <path>

This can be even called multiple times and will only append once to the path. Note that the builtin errors if the path doesn't exist.

This worked for me! Thank you!

@re3factor
Copy link

Currently running into this issue, I've tried almost everything in this thread, anyone available to help?
image

@social-anthrax
Copy link

Very much necroing this issue, but I'm trying to figure out what would be the best approach to adding cargo to path. It seems like there are currently three possibilities; Using fish_add_path, set -Up fish_user_paths and adding the existing source file to $__fish_config_dir/conf.d/. While the first two are more to the spirit of fish, it makes it more difficult to remove it, and the last one feels like a hack. Any thoughts regarding what the proper way to approach this would be appreciated.

@DCNick3
Copy link

DCNick3 commented May 23, 2022

Any thoughts regarding what the proper way to approach this would be appreciated.

I think that fish_add_path seems to be the best way for now, as it is shorted and idempotent (it checks is the path is already in the PATH yet)

@social-anthrax
Copy link

Reading through the thread again, the official advice from 2016 was source the env file from ~/.config/fish/conf.d/ from fish shell issue 3170. This makes the removal significantly easier as we can just remove the cargo.fish file from conf.d

@re3factor
Copy link

@social-anthrax @DCNick3 Thank you both very much, sorry for the necro, I just realized I never sent my appreciation.

@iMonZ
Copy link

iMonZ commented Sep 30, 2022

Any update here?

@salimp2009
Copy link

Just trying to use fish I have rust, ghcup (for Haskell) that all have their binaries under $HOME
and i also have nix and it has bunch of nix related folders in the home directory none of those work properly if fish becomes default shell unless I edit config.fish like this. I still need to figure out nix cause it is a little different config set.

`if status is-interactive
# Commands to run in interactive sessions can go here
end

if status --is-login
set -gx PATH "$HOME/.cargo/bin" $PATH;
export PATH="$HOME/.cabal/bin:$PATH"
export PATH="HOME/.ghcup/bin:$PATH"
end`

@SirMishaa
Copy link

SirMishaa commented Oct 23, 2022

Hello,

For fish 3.2.0 or upper, released in March 2021, the easiest way to add rust to path permanently is like that:

fish_add_path $HOME/.cargo/bin

It will automatically append the specified folder to fish_user_paths in $HOME/.config/fish/fish_variables.
Documentation can be found here: https://fishshell.com/docs/current/cmds/fish_add_path.html

I hope it helps


Would a Rust team maintainer be interested in a pull request that checks the shell used and acts accordingly?
Concretely, it's just a small condition in the source file to have the path added automatically (using fish_add_path) when the user uses Fish as shell.

Please let me know.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
No open projects
Issue Categorisation
Environment issues