¿Cómo eliminar una ruta de la variable $ PATH en peces?

20

Estoy usando fish como mi shell en Debian y recientemente (después de alguna actualización) cada vez que intento usar la finalización de comandos tengo:

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

Ejecutando esto:

echo $PATH 

Me da esto:

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

En mi sistema no existe /usr/lib/x86_64-linux-gnu/libfm, así que entiendo por qué el pez se queja, pero no puedo encontrar cómo eliminar esta ruta de mi $PATHvariable.

¿Alguien sabe cómo puedo hacer esto?

tomekK
fuente
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 / fish / usr / share / fish
tomekK

Respuestas:

33

La forma 'pez' de establecer la variable $ PATH es usarla realmente set --universal fish_user_paths $fish_user_paths /new/path/here. Entonces $ fish_user_paths en realidad se antepone a la variable $ PATH cuando comienza una nueva sesión. Sin embargo, la documentación de $ PATH actualmente no le dice cómo eliminarla.

En fish, cada variable es en realidad una lista (matriz), y puede acceder convenientemente a cada elemento directamente utilizando un índice / índice. echo $fish_user_pathsimprimirá una versión del espacio delimitado cada elemento de la lista, hacen que los espacios de nueva línea con la función de traducir echo $fish_user_paths | tr " " "\n"y luego poner los números de línea en él con el número de función líneas, echo $fish_user_paths | tr " " "\n" | nl. Luego bórrelo con set --erase --universal fish_user_paths[5]. Debe usar --universalo no funcionará en ninguna sesión nueva.

Si alguien tiene tiempo, envíe un PR al repositorio con este ejemplo. Abrí un problema aquí .

tldr;

  1. echo $fish_user_paths | tr " " "\n" | nl // obtén el número del que deseas eliminar, por ejemplo, el quinto
  2. set --erase --universal fish_user_paths[5] // borra la 5ta ruta universalmente para que persista en nuevas sesiones
Elijah Lynn
fuente
¿Por qué es esto tan arcano? ¿No debería ser una función incorporada y agregada a la documentación para que las personas no tengan que buscar en Google y terminar aquí? Oh, bueno ...
Pär Nils Amsen
Creo que si tomamos @ respuesta de clozach aquí superuser.com/a/1212305/30982 , que es el addpaths () y la función removepath (), y abrir un PR entonces que sería el primer paso para conseguir que se añadió. La mayoría de los mantenedores son bastante buenos para trabajar, uno me parece malhumorado, pero en general creo que tendríamos una buena oportunidad. Entonces ese es nuestro próximo paso.
Elijah Lynn
9

Como dice Elijah, la mejor práctica es modificar fish_user_pathslo global en lugar de lo global PATH. Para evitar tener que volver a Google esto de nuevo ...

  1. Crea un par de funciones que solo modifiquenfish_user_paths
  2. Hacer que ambas funciones se carguen automáticamente

Para agregar a rutas de usuario:

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

Para eliminar una ruta de usuario si existe (crédito parcial a esto ):

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

Y, por supuesto, para que se carguen automáticamente :

funcsave addpaths; funcsave removepath

Ejemplo 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
fuente
Nota: Acabo de descubrir que este enfoque no eliminará una ruta agregada a través de algún otro mecanismo; Es posible que deba realizar una limpieza de archivos de puntos si encuentra una ruta de regreso cada vez que abre una nueva sesión de terminal.
clozach
¡Esto es genial, recién agregado a mi local!
Elijah Lynn el
3

Esto debería borrar las rutas 6 a través de la última ruta:

set -e PATH[6..-1]

La bandera -e está borrada. Ver help set.

alxrsngrtn
fuente
esto solo funcionará para la sesión actual
Daniel