如何从 fish 中的 $PATH 变量中删除路径?

如何从 fish 中的 $PATH 变量中删除路径?

我在 Debian 中使用 fish 作为我的 shell,最近(升级之后)每当我尝试使用命令完成时,我都会遇到:

set: No such file or directory
set: Could not add component /usr/lib/x86_64-linux-gnu/libfm to PATH.
set: No such file or directory

运行这个:

echo $PATH 

给我这个:

/usr/lib/x86_64-linux-gnu/libfm /usr/local/bin /usr/bin /bin /usr/local/games /usr/games

在我的系统中没有/usr/lib/x86_64-linux-gnu/libfm,所以我理解为什么鱼会抱怨,但我找不到如何从我的$PATH变量中删除这条路径。

有人知道我该怎么做吗?

答案1

设置 $PATH 变量的“fish”方式实际上是使用set --universal fish_user_paths $fish_user_paths /new/path/here。然后,当新会话开始时,$fish_user_paths 实际上被添加到 $PATH 变量的前面。$PATH文档但目前还没有告诉您如何删除它。

在 fish 中,每个变量实际上都是一个列表(数组),您可以使用索引/索引直接方便地访问每个项目。echo $fish_user_paths将打印出列表中每个项目的空格分隔版本,使用翻译函数将空格变为换行符echo $fish_user_paths | tr " " "\n",然后使用数字行函数在其上添加行号echo $fish_user_paths | tr " " "\n" | nl。然后用删除它set --erase --universal fish_user_paths[5]。您必须使用--universal,否则它将无法在任何新会话中工作。

如果有人有时间,请向回购举个例子。我开了一个问题这里

太长不看;

  1. echo $fish_user_paths | tr " " "\n" | nl// 获取要删除的编号,例如第 5 个
  2. set --erase --universal fish_user_paths[5]// 彻底删除第五条路径,以便它在新会话中继续存在

答案2

正如 Elijah 所说,最佳做法是修改fish_user_paths而不是全局PATH。为了避免再次谷歌搜索此内容……

  1. 创建几个函数仅修改fish_user_paths
  2. 使两个功能都自动加载

要添加到用户路径:

function addpaths
    contains -- $argv $fish_user_paths
       or set -U fish_user_paths $fish_user_paths $argv
    echo "Updated PATH: $PATH"
end

删除用户路径 如果存在(部分归功于):

function removepath
    if set -l index (contains -i $argv[1] $PATH)
        set --erase --universal fish_user_paths[$index]
        echo "Updated PATH: $PATH"
    else
        echo "$argv[1] not found in PATH: $PATH"
    end
end

当然,为了制作它们自动加载

funcsave addpaths; funcsave removepath

用法示例:

> addpaths /etc /usr/libexec
Modifying PATH: /usr/local/bin /usr/bin /bin /usr/sbin /sbin
Updated PATH: /etc /usr/libexec /usr/local/bin /usr/bin /bin /usr/sbin /sbin

> removepath /usr/libexec
Modifying PATH: /etc /usr/libexec /usr/local/bin /usr/bin /bin /usr/sbin /sbin
Updated PATH: /etc /usr/local/bin /usr/bin /bin /usr/sbin /sbin

答案3

这应该会删除从第 6 条路径到最后一条路径:

set -e PATH[6..-1]

-e 标志是擦除。请参阅help set

答案4

重置fish_user_paths没有你不再想要的路径:

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

更多信息:https://fishshell.com/docs/current/tutorial.html#tut_path

相关内容