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


20

我在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,因此我了解了fish为何抱怨,但是我找不到如何从$PATH变量中删除此路径的方法。

有人知道我该怎么做吗?


grep -R /usr/lib/x86_64-linux-gnu/libfm ~/.config/fish /usr/share/fish??
glenn jackman 2014年

$ grep -R / usr / lib / x86_64-linux-gnu / libfm〜/ .config / fish / usr / share / fish /home/superuser/.config/fish/fish_history:grep -R / usr / lib / x86_64- linux-gnu / libfm〜/ .config / fish / usr / share / fish
tomekK 2014年

Answers:


33

设置$ PATH变量的“钓鱼”方法是实际使用set --universal fish_user_paths $fish_user_paths /new/path/here。然后,当新会话开始时,$ fish_user_paths实际上是$ PATH变量的前缀。$ PATH 文档目前没有告诉您如何删除它。

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

如果有时间,请使用此示例将PR提交给仓库。我在这里开了一个问题。

tldr;

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

为什么这么神秘?这不应该是内置功能并添加到文档中,这样人们就不必使用Google并最终落在这里了吗?噢..
尼尔·安森(PärNils Amsen)'18年

我认为,如果我们在这里使用@clozach的答案superuser.com/a/1212305/30982(即addpaths()和removepath()函数)并打开PR,那么这将是添加它的第一步。大多数维护人员都可以与之合作,对我来说似乎很脾气暴躁,但总的来说,我认为我们会有很大的机会。这就是我们的下一步。
伊利亚·林恩

9

正如以利亚所言,最佳实践是修改fish_user_paths而不是全局PATH。为了避免再次使用Google……

  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

注意:我刚刚发现这种方法不会删除通过其他机制添加的路径。如果您发现每次打开新的终端会话都返回一条路径,则可能需要进行一些点文件清理。
clozach

太好了,只添加到我的本地!
伊利亚·林恩

3

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

set -e PATH[6..-1]

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


这仅适用于当前会话
Daniel
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.