Como remover um caminho da variável $ PATH no fish?

20

Estou usando o fish como meu shell no Debian e recentemente (após algumas atualizações) sempre que tento usar a conclusão de comandos, tenho:

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

Executando isso:

echo $PATH 

Dá-me isto:

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

No meu sistema, não há /usr/lib/x86_64-linux-gnu/libfm, então eu entendo por que o peixe está reclamando, mas não consigo encontrar como remover esse caminho da minha $PATHvariável.

Alguém sabe como posso fazer isso?

tomekK
fonte
grep -R /usr/lib/x86_64-linux-gnu/libfm ~/.config/fish /usr/share/fish??
Glenn Jackman
$ 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 / peixe / usr / share / peixe
Tomekk

Respostas:

33

A maneira 'fish' de definir a variável $ PATH é realmente usar set --universal fish_user_paths $fish_user_paths /new/path/here. Então $ fish_user_paths é realmente anexado à variável $ PATH quando uma nova sessão é iniciada. A documentação do $ PATH atualmente não diz como excluí-lo.

No peixe, toda variável é realmente uma lista (matriz), e você pode acessar convenientemente cada item diretamente usando um índice / índice. echo $fish_user_pathsimprimirá uma versão delimitada por espaço de cada item da lista, criará uma nova linha de espaços com a função de conversão echo $fish_user_paths | tr " " "\n"e depois colocará números de linhas nela com a função de linhas numéricas echo $fish_user_paths | tr " " "\n" | nl,. Em seguida, exclua-o com set --erase --universal fish_user_paths[5]. Você deve usar --universalou ele não funcionará em nenhuma nova sessão.

Se alguém tiver tempo, envie um PR ao repositório com este exemplo. Abri um problema aqui .

tldr;

  1. echo $fish_user_paths | tr " " "\n" | nl // obtém o número do que você deseja excluir, por exemplo, o quinto
  2. set --erase --universal fish_user_paths[5] // apaga o quinto caminho universalmente para que persista em novas sessões
Elijah Lynn
fonte
Por que isso é tão misterioso? Isso não deveria ser um recurso incorporado e adicionado à documentação para que as pessoas não precisem usar o Google e acabar aqui? Oh bem ..
Pär Nils Amsen 30/01
Eu acho que se pegarmos a resposta da @ clozach aqui superuser.com/a/1212305/30982 , que é a função addpaths () e removepath (), e abrir um PR, esse seria o primeiro passo para obtê-lo. A maioria dos mantenedores é muito boa de se trabalhar, um parece mal-humorado para mim, mas no geral acho que teríamos uma boa chance. Então esse é o nosso próximo passo.
Elijah Lynn
9

Como Elias diz, a melhor prática é modificar fish_user_pathso global e não o global PATH. Para evitar ter que pesquisar no Google novamente ...

  1. Crie algumas funções que modificam apenasfish_user_paths
  2. Tornar as duas funções de carregamento automático

Para adicionar aos caminhos do usuário:

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

Para remover um caminho do usuário, se existir (crédito parcial para isso ):

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

E, é claro, para fazê-los carregar automaticamente :

funcsave addpaths; funcsave removepath

Exemplo de uso:

> 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
fonte
Nota: Acabei de descobrir que essa abordagem não removerá um caminho adicionado por meio de outro mecanismo; Alguma limpeza de arquivo ponto pode estar em ordem, se você encontrar um caminho retornando cada vez que abrir uma nova sessão do terminal.
Clozach
Isso é ótimo, apenas adicionado ao meu local!
Elias Lynn
3

Isso deve apagar os caminhos 6 até o último caminho:

set -e PATH[6..-1]

A bandeira -e é apagada. Veja help set.

alxrsngrtn
fonte
isso só funcionará para a sessão atual
Daniel