用鱼壳修改 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 上是如何设置的。
接下来,像bash
或csh
,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 环境变量中。
【讨论】:
你也可以安装 exportomf 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 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章