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

14

Estou usando o fish como meu shell no Debian e recentemente (após alguma atualização) sempre que tento usar o comando completion, eu 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 

Me dá 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 porque o peixe está reclamando, mas não consigo encontrar como remover esse caminho da minha variável $PATH .

Alguém sabe como posso fazer isso?

    
por tomekK 02.07.2014 / 14:21

3 respostas

20

A maneira 'fish' de definir a variável $ PATH é usar set --universal fish_user_paths $fish_user_paths /new/path/here . Em seguida, $ fish_user_paths é, na verdade, anexado à variável $ PATH quando uma nova sessão é iniciada. No entanto, a documentação do $ PATH atualmente não informa como excluí-la.

Em fish, cada variável é, na verdade, uma lista (array), e você pode acessar convenientemente cada item diretamente usando um índice / índice. echo $fish_user_paths imprimirá uma versão delimitada por espaço de cada item da lista, criará novos espaços com a função de conversão echo $fish_user_paths | tr " " "\n" e, em seguida, colocará os números de linha 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 --universal ou não funcionará em nenhuma nova sessão.

Se alguém tiver tempo, envie um PR para o repositório com este exemplo. Eu 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 5º
  2. set --erase --universal fish_user_paths[5] // apaga o quinto caminho universalmente para que ele persista em novas sessões
por 22.06.2016 / 02:18
6

Como Elijah diz, a melhor prática é modificar o fish_user_paths em vez do global PATH . Para evitar ter que voltar a pesquisar no Google…

  1. Crie algumas funções que modifiquem apenas fish_user_paths
  2. Faça as duas funções autoloading

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 de usuário se existir (crédito parcial para isto ):

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á-los autoloading :

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
    
por 24.05.2017 / 09:49
3

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

set -e PATH[6..-1]

O sinalizador -e é apagado. Veja help set .

    
por 13.07.2015 / 19:00