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

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

Estoy usando fish como mi shell en Debian y recientemente (después de alguna actualización) cada vez que intento utilizar 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 hay /usr/lib/x86_64-linux-gnu/libfm, así que entiendo por qué Fish se queja, pero no encuentro cómo eliminar esta ruta de mi $PATHvariable.

¿Alguien sabe cómo puedo hacer esto?

Respuesta1

La forma 'fish' de configurar la variable $PATH es usar set --universal fish_user_paths $fish_user_paths /new/path/here. Luego, $fish_user_paths en realidad se antepone a la variable $PATH cuando comienza una nueva sesión. El $RUTAdocumentaciónSin embargo, actualmente no te dice cómo eliminarlo.

En fish, cada variable es en realidad una lista (matriz), y puede acceder cómodamente a cada elemento directamente utilizando un índice/índice. echo $fish_user_pathsimprimirá una versión delimitada por espacios de cada elemento de la lista, creará una nueva línea con los espacios con la función de traducción echo $fish_user_paths | tr " " "\n"y luego colocará números de línea con la función de líneas numéricas echo $fish_user_paths | tr " " "\n" | nl. Luego elimínalo con set --erase --universal fish_user_paths[5]. Debe usarlo --universalo no funcionará en ninguna sesión nueva.

Si alguien tiene tiempo, envíe un PR alrepositoriocon este ejemplo. Abrí un problemaaquí.

tldr;

  1. echo $fish_user_paths | tr " " "\n" | nl// obtenemos el número del que deseas eliminar, por ejemplo, el quinto
  2. set --erase --universal fish_user_paths[5]// borra la quinta ruta universalmente para que persista en nuevas sesiones

Respuesta2

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

  1. Crea un par de funciones quesolo modificarfish_user_paths
  2. hacer ambas funcionescarga automática

Para agregar a las 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 existiera(crédito parcial aeste):

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 hacerloscarga automática:

funcsave addpaths; funcsave removepath

Uso de ejemplo:

> 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

Respuesta3

Esto debería borrar las rutas 6 hasta la última ruta:

set -e PATH[6..-1]

La bandera -e se borra. Ver help set.

Respuesta4

Reiniciarrutas_usuario_pezsin el camino que ya no quieres:

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

Más información:https://fishshell.com/docs/current/tutorial.html#tut_path

información relacionada