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

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

Estou usando fish como meu shell no Debian e recentemente (após alguma atualização) 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 isto:

echo $PATH 

Me dá isso:

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

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

Alguém sabe como posso fazer isso?

Responder1

A maneira 'peixe' de definir a variável $PATH é realmente usar set --universal fish_user_paths $fish_user_paths /new/path/here. Então $fish_user_paths é, na verdade, anexado à variável $PATH quando uma nova sessão é iniciada. O $PATHdocumentaçãoatualmente não informa como excluí-lo.

No fish, cada variável é na verdade uma lista (array), 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, transformará os espaços em nova linha com a função de tradução echo $fish_user_paths | tr " " "\n"e, em seguida, colocará números de linha nele 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 não funcionará em nenhuma nova sessão.

Se alguém tiver tempo, envie um PR para orepositóriocom este exemplo. Abri um problemaaqui.

tldr;

  1. echo $fish_user_paths | tr " " "\n" | nl// obtém o número daquele que você deseja excluir, por exemplo, o 5º
  2. set --erase --universal fish_user_paths[5]// apaga o 5º caminho universalmente para que ele persista em novas sessões

Responder2

Como diz Elijah, a melhor prática é modificar o arquivo fish_user_pathsem vez do global PATH. Para evitar ter que pesquisar isso no Google novamente…

  1. Crie algumas funções queapenas modificarfish_user_paths
  2. Faça as duas funçõescarregamento automático

Para adicionar caminhos de 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 de usuário se existe(crédito parcial paraesse):

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 torná-loscarregamento automático:

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

Responder3

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

set -e PATH[6..-1]

O sinalizador -e é apagado. Ver help set.

Responder4

Reiniciarfish_user_pathssem o caminho que você não quer mais:

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

Mais informações:https://fishshell.com/docs/current/tutorial.html#tut_path

informação relacionada