使用fish shell修改路径[已关闭]

rn0zuynd  于 2023-01-05  发布在  Shell
关注(0)|答案(8)|浏览(198)

此问题似乎与a specific programming problem, a software algorithm, or software tools primarily used by programmers无关。如果您认为此问题与another Stack Exchange site的主题有关,您可以留下评论,说明在何处可以回答此问题。
1年前关闭。
社区在6个月前审查了是否重新讨论该问题,并将其关闭:
原始关闭原因未解决
Improve this question
我目前正在使用fish shell,但在理解如何设置PATH变量时遇到了一些麻烦,为了值得,我还使用了oh-my-fish
如果我回显当前路径,则得到:

➜ 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

查看~/.config/fish/config.fish,我看到下面这行

set PATH /usr/local/bin $PATH /Users/myname/.opam/system/bin

我的问题是(这个措辞可能会反映出我对这个问题缺乏知识):在处理config.fish之前,PATH变量集在哪里?即:/usr/local/bin/Users/myname/.opam/system/bin之间的所有路径来自何处?

guykilcj

guykilcj1#

正如fish官方教程中所述,您可以修改$fish_user_paths通用变量。
从命令行运行以下命令一次:

set -U fish_user_paths /usr/local/bin $fish_user_paths

这将把/usr/local/bin永久地放在路径前面,并且会影响当前会话和所有未来的示例,因为-U参数将使变量成为 universal
来自fish文档:
...(注意:您不应该将这一行添加到config.fish中。如果您这样做,则每次运行fish时变量都会变长!)
fish_user_paths,附加在PATH前面的目录列表。这可以是一个通用变量。

lqfhib0f

lqfhib0f2#

当前答案

截至2021年3月发布的fish 3.2.0,规范方法为:

fish_add_path /opt/mycoolthing/bin

这在config.fish中以交互方式一次性工作-在config.fish的情况下不会产生重复。

以前对fish〈3.2.0的回答

从fish的maintainers修改PATH的建议命令如下:
1.如果要运行命令一次:

set -Ua fish_user_paths /path

1.如果要向启动脚本中添加命令,则此函数是幂等的:

contains /path $fish_user_paths; or set -Ua fish_user_paths /path
m1m5dgzv

m1m5dgzv3#

像所有的shell一样,fish从它启动的环境中继承了它的PATH。不同的操作系统对登录shell设置的方式不同--例如,在Linux上,/etc/login.defs控制所有登录shell的初始PATH设置。
接下来,像bashcsh,shell的初始化文件可能会改变路径。对于OS X上的fish,share/fish/config.fish中有代码从标准OS X路径配置文件/etc/paths/etc/paths.d/*加载路径。在Solaris上有替代代码设置有用的路径。
还有一些代码可以从通用变量$fish_user_paths中获取路径,这是向PATH添加内容并使其在所有shell中反映的正确方法。

41zrol4v

41zrol4v4#

1.枚举用户路径:

echo $fish_user_paths | tr " " "\n" | nl

2.追加新的bin路径,永久:

set -ga fish_user_paths my_appended_path

3.按索引删除第7个bin搜索路径:(参见#1):

set —eg fish_user_paths[7]
dohp0rv5

dohp0rv55#

对我起作用的方式是:
~/.config/fish/config.fish中添加以下行:
set -gx PATH /path/to/dir1 /path/to/dir2 $PATH这会将这些目录附加到$PATH环境变量中。

iq0todco

iq0todco6#

为了设置shell config file的变量,我做了如下操作:
设置任何用户特定变量的主命令是
set -Ua fish_user_paths /path/to/bin/directory/
set -Ux fish_user_paths /usr/local/bin运行touch ~/.config/fish/config.fish,除非它存在。

  1. RUSTset -Ua fish_user_paths $HOME/.cargo/bin
  2. JAVAset -Ua fish_user_paths /path/to/java/bin
  3. Nodenvm:确保你已经安装nvm正确然后
    x1米11米1x
    set -gx NVM_DIR /path/to/nvm
    1.一个月十三个月一个月:一个月十四个月
    1.一个月十五日一次:一个月十六日一次
    1.一个月十七个月一个月:一个月十八个月一个月
    1.一个月十九个月一个月:一个月二十个月一个月
    1.一个月21日一个月:一个月22日一个月
    最后,刷新终端。
    某些操作系统(如OpenSuse)中的PS,删除a

esbemjvw

esbemjvw7#

以上解决方案不能很好地与python虚拟环境一起工作。虚拟环境的路径不会是列表中的第一个。
为了设置一次路径,并且在每次启动python虚拟环境时不覆盖它
您需要在~/.config/fish/config.fish中有条件地更改路径,如下所示:

contains /home/$USER/.pyenv/bin $PATH; or set -x PATH "/home/$USER/.pyenv/bin" $PATH
contains /home/$USER/.local/bin $PATH; or set -x PATH "/home/$USER/.local/bin" $PAT
contains /home/$USER/.asdf/bin $PATH; or source ~/.asdf/asdf.fish

这将确保您在$PATH中有新的路径,但是当您为虚拟环境生成新的shell时,您将不会再次添加这些路径。
不幸的是,使用set -Ua fish_user_paths设置的路径将在$PATH的开头结束,从而使您的虚拟环境路径远离第一个位置。

vi4fp9gy

vi4fp9gy8#

您可以使用类似下面的脚本来轻松添加或删除路径:

#!/usr/bin/env fish

#remove PHP72
for argv in /usr/local/opt/php@7.2/bin /usr/local/opt/php@7.2/sbin;
    while contains $argv $fish_user_paths
        set -l index (contains -i $argv $fish_user_paths)
        set –erase –universal fish_user_paths[$index]
    end
end

#add PHP74
for argv in /usr/local/opt/php@7.4/bin /usr/local/opt/php@7.4/sbin;
    if contains $argv $fish_user_paths
        echo "Path already contains $argv"
    else
fish_add_path $argv
    end
end

echo $fish_user_paths | tr " " "\n" | nl

brew services stop php@7.2
brew services start php@7.4

https://www.tai.ro/2021/10/22/how-to-switch-path-in-fish-shell-with-example-script/复制

相关问题