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 $PATH
variá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_paths
imprimirá 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 --universal
ou 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;
echo $fish_user_paths | tr " " "\n" | nl
// obtém o número daquele que você deseja excluir, por exemplo, o 5º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_paths
em vez do global PATH
. Para evitar ter que pesquisar isso no Google novamente…
- Crie algumas funções queapenas modificar
fish_user_paths
- 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