如何在鱼壳中的每个会话中永久设置环境?

问题描述

我安装了 cargo 构建环境。 我使用 cargo install exa 安装 exa(命令 ls 的替代方案)。 可执行文件放在$HOME/.cargo/bin中。 我使用 fish shell set -gx PATH $PATH $HOME/.cargo/bin,然后我可以在当前会话中使用命令 exa

但是当我打开一个新会话时,除非再次exa,否则我无法执行set -gx ...

我查看选项 gx

--global  -g     (Make variable scope global)
--export  -x  (Export variable to subprocess)

全局不就是每一个会话吗?有人可以帮我吗?

解决方法

全局不就是每次会话吗?

它没有。它是“全球”而不是“本地”。来自the fish documentation

全局变量特定于当前的鱼会话,除非使用 set -e 明确请求,否则永远不会被删除。

一般来说,您想要的只是将 set -gx 放入 ~/.config/fish/config.fish 中。这是fish的配置文件。

Fish 也有“通用”变量, 持久存储,但它们与导出的交互很尴尬,所以我不推荐它。

特别是对于 $PATH,fish 提供了它自动添加的 fish_user_paths 变量,因此您可以运行

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

一次,交互,fish 会处理它。这是一个通用变量,但 fish 会在必要时将它添加到 $PATH 中(对于每个组件,它会检查它是否已经存在等等)。不要不要将其放入 config.fish 中,否则每次启动鱼时它都会添加一个 $HOME/.cargo/bin,因此它会使变量膨胀。

总结:

  • 对于全局变量,将 set 语句放入 config.fish
  • 对于通用变量,手动执行
  • 对于 $PATH,使用 $fish_user_paths 进行自定义