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

tom*_*ekK 25 shell path environment-variables fish

我在 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
Run Code Online (Sandbox Code Playgroud)

运行这个:

echo $PATH 
Run Code Online (Sandbox Code Playgroud)

给我这个:

/usr/lib/x86_64-linux-gnu/libfm /usr/local/bin /usr/bin /bin /usr/local/games /usr/games
Run Code Online (Sandbox Code Playgroud)

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

有谁知道我该怎么做?

Eli*_*ynn 43

设置 $PATH 变量的“鱼”方式是实际使用set --universal fish_user_paths $fish_user_paths /new/path/here. 然后 $fish_user_paths 实际上是在新会话开始时添加到 $PATH 变量中的。$PATH文档目前没有告诉你如何删除它。

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

如果有人有时间,请使用此示例向repo提交 PR 。我在这里打开了一个问题。

tldr;

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

  • 为什么这如此神秘?难道这不应该是一个内置功能并添加到文档中,这样人们就不必谷歌并最终到达这里吗?那好吧.. (8认同)
  • 由于某些原因,这个 `set --erase --universal Fish_user_paths[4]` 在 v3.3.1 中对我不起作用。没有错误,但路径没有从列表中删除。 (2认同)

clo*_*ach 14

以利亚说,最好的做法是改变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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

当然,要使它们自动加载

funcsave addpaths; funcsave removepath
Run Code Online (Sandbox Code Playgroud)

示例用法:

> 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
Run Code Online (Sandbox Code Playgroud)

  • 在最新版本的fish中添加的更好的解决方案是使用fish_add_path命令。https://fishshell.com/docs/current/cmds/fish_add_path.html (2认同)

小智 7

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

set -e PATH[6..-1]
Run Code Online (Sandbox Code Playgroud)

-e 标志被擦除。看help set