用鱼壳修改 PATH [关闭]

Posted

技术标签:

【中文标题】用鱼壳修改 PATH [关闭]【英文标题】:Modifying PATH with fish shell [closed] 【发布时间】:2014-11-30 05:46:26 【问题描述】:

我目前正在使用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 之间的所有路径都来自哪里?

【问题讨论】:

文档描述了初始化文件:fishshell.com/docs/current/index.html#initialization 啊。我试图找到第二个文件(/etc/fish/config.fish)但找不到。我怀疑这是因为我用自制软件安装了鱼。我运行find / -name config.fish 来查找我系统上的所有config.fish 文件。结果是:/Users/name/.config/fish/config.fish/Users/name/.oh-my-fish/templates/config.fish/usr/local/Cellar/fish/2.1.0/etc/fish/config.fish/usr/local/Cellar/fish/2.1.0/share/fish/config.fish/usr/local/etc/fish/config.fish。我检查了所有结果,但似乎都没有指定任何 PATH 值。 【参考方案1】:

如official fish tutorial 中所述,您可以修改$fish_user_paths 通用变量。

从命令行运行一次:

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

这会将/usr/local/bin 永久添加到您的路径中,并且还会影响当前会话和所有未来的实例,因为-U 参数将使变量通用

来自fish 文档:

...(注意:您不应该将此行添加到config.fish。如果这样做,每次运行 fish 时变量都会变长!)

fish_user_paths,附加到 PATH 的目录列表。这可以是一个通用变量。

【讨论】:

不要将此添加到您的 fish_config 文件中!它应该作为命令执行。 -U 不是必需的,因为fish_user_paths 已经是通用的。 由于 fish 3.x PATH 不会增长,fish 检查来自 fish_user_paths 的任何特定路径是否存在于 PATH 中,如果不存在 - 前置,如果是则删除它并前置。 所以这个“fish_user_paths”是一个实际的路径或命令?还是我必须提供像 /folder1/folder2 这样的实际路径? @Phlogi set -U fish_user_paths /opt/bin 是完整的命令,而 fish_user_paths 是鱼壳变量。【参考方案2】:

截至 2021 年 3 月发布的 fish 3.2.0,标准答案是:

fish_add_path /opt/mycoolthing/bin

fish

从fish的maintainers修改PATH的推荐命令是:

    如果你想运行一次命令:

    set -Ua fish_user_paths /path
    

    如果要在启动脚本中添加命令,这是幂等的:

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

【讨论】:

@Maximilian 谢谢!这个答案的第二部分绝对帮助我解决了鱼会话中的缓慢启动问题。我一直在使用类似于 config.fish 文件中的第一个命令的东西。 github.com/fish-shell/fish-shell/issues/6136【参考方案3】:

与所有 shell 一样,fish 从它启动的环境继承其 PATH。如何为登录 shell 设置不同的操作系统 - 例如,在 Linux 上,/etc/login.defs 控制所有登录 shell 的初始 PATH 设置。我不知道这在 OS X 上是如何设置的。

接下来,像bashcsh,shell 的初始化文件可能会改变路径。对于 OS X 上的鱼,share/fish/config.fish 中有用于从标准 OS X 路径配置文件 /etc/paths/etc/paths.d/* 加载路径的代码。有替代代码可以在 Solaris 上设置有用的路径。

还有从通用变量$fish_user_paths(即right way to add something to your PATH and have it reflected across all shells)获取路径的代码。

【讨论】:

【参考方案4】:

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]

【讨论】:

试过这个。必须使用set --erase fish_user_paths[1] 才能工作。在擦除之前错过了一个破折号,-g 在当前版本中显然不是一个选项。 谢谢 - 我已经更新了第三条指令:set -eg works set -eg 对我不起作用(fish 版本 3.1.2),但 set --erase 对我起作用。【参考方案5】:

为了给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,除非它存在。

    RUST:set -Ua fish_user_paths $HOME/.cargo/bin

    JAVA:set -Ua fish_user_paths /path/to/java/bin

    Node & nvm: 然后确保你已经正确安装了nvm

    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/

最后,刷新你的终端。

PS 在某些操作系统(例如 OpenSuse)中,删除a

【讨论】:

【参考方案6】:

和我一起工作的方式:

在您的~/.config/fish/config.fish 中添加以下行:

set -gx PATH /path/to/dir1 /path/to/dir2 $PATH 这会将这些目录附加到您的 $PATH 环境变量中。

【讨论】:

你也可以安装 export omf install export .. 这基本上带回了类似 bash 的导出命令 这不会添加,而是将目录添加到 PATH 中。要附加它们,请改用set -gx PATH $PATH /path/to/dir【参考方案7】:

上述解决方案不适用于 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 的开头,从而将您的虚拟环境路径推离首位。

【讨论】:

【参考方案8】:

您可以使用如下脚本来轻松添加或删除路径:

#!/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/

【讨论】:

以上是关于用鱼壳修改 PATH [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

我在我的电脑上安装了鱼壳,现在我无法打开 VS 代码终端 [关闭]

linux查看和修改PATH环境变量的方法

linux查看和修改PATH环境变量的方法

linux修改环境变量分析

linux修改环境变量分析

怎么修改Win7环境变量PATH