用鱼壳修改 PATH

我目前正在玩的 鱼壳和我有一些麻烦缠绕我的头如何 PATH变量设置。不管怎样,我还是用了 天啊

如果我重复我当前的路径,我会得到:

➜ 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之间的所有路径都来自哪里?

111863 次浏览

和所有的 shell 一样,fish 从它所处的环境继承 PATH。登录 shell 的设置方式因操作系统而异——例如,在 Linux 上,/etc/login.defs控制所有登录 shell 的初始 PATH 设置。我不知道这是如何设置在 OS X。

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

还有从通用变量 $fish_user_paths(即 以正确的方式向 PATH 添加内容,并将其反映到所有的 shell 中)中获取路径的代码。

正式的鱼类教程中所述,您可以修改 $fish_user_paths通用变量。

从命令行运行以下命令:

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

这将永久性地将 /usr/local/bin作为路径的前缀,并将影响当前会话和所有未来实例,因为-U 参数将使变量 通用的

来自 fish文档:

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

Fish _ user _ PATH,PATH 前面的目录列表。这可以是一个通用变量。

根据2021年3月发布的 鱼3.2.0,标准答案是:

fish_add_path /opt/mycoolthing/bin

对于 fish 的现有解答 < 3.2.0:

从 fish 的 维护者修改 PATH的推荐命令如下:

  1. 如果要运行该命令一次:

    set -Ua fish_user_paths /path
    
  2. 如果要向启动脚本添加命令,这是幂等的:

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

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]

为了设置 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. RUST: set -Ua fish_user_paths $HOME/.cargo/bin

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

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

    omf install nvm

    set -gx NVM_DIR /path/to/nvm

  4. Go: set -Ua fish_user_paths /path/to/go/bin/

  5. Scala: set -Ua fish_user_paths /path/to/scala/bin/

  6. Groovy: set -Ua fish_user_paths /path/to/groovy/bin/

  7. Maven: set -Ua fish_user_paths /path/to/mvn/bin/

  8. Gradle: set -Ua fish_user_paths /path/to/groovy/bin/

最后,刷新您的终端。

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

The result after configuration

上述解决方案不能很好地与 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 的开头结束,从而使您的虚拟环境路径偏离了最初的位置。

您可以使用下面这样的脚本来简化添加或删除路径:

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

对我起作用的方式是:

在你的 ~/.config/fish/config.fish中加上以下一行:

set -gx PATH /path/to/dir1 /path/to/dir2 $PATH 这将把这些目录追加到 $PATH 环境变量。