Comment supprimer un chemin de la variable $ PATH dans le poisson?

20

J'utilise fish comme shell dans Debian et récemment (après une mise à niveau) chaque fois que j'essaie d'utiliser la complétion de commande, j'ai:

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

Exécuter ceci:

echo $PATH 

Me donne ceci:

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

Dans mon système, il n'y a pas /usr/lib/x86_64-linux-gnu/libfm, donc je comprends pourquoi le poisson se plaint, mais je ne trouve pas comment supprimer ce chemin de ma $PATHvariable.

Est-ce que quelqu'un sait comment faire cela?

tomekK
la source
grep -R /usr/lib/x86_64-linux-gnu/libfm ~/.config/fish /usr/share/fish??
glenn jackman le
$ 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

Réponses:

33

La manière «poisson» de définir la variable $ PATH est d'utiliser réellement set --universal fish_user_paths $fish_user_paths /new/path/here. Ensuite, $ fish_user_paths est en fait ajouté à la variable $ PATH lorsqu'une nouvelle session démarre. La documentation de $ PATH ne vous indique cependant pas comment le supprimer.

Dans le poisson, chaque variable est en fait une liste (tableau), et vous pouvez accéder facilement à chaque élément directement en utilisant un index / indice. echo $fish_user_pathsimprimera un espace délimité par la version de chaque élément dans la liste, font les espaces Newline avec la fonction traduire echo $fish_user_paths | tr " " "\n"et mettre des chiffres en ligne sur avec le nombre de lignes fonctionnent, echo $fish_user_paths | tr " " "\n" | nl. Supprimez-le ensuite avec set --erase --universal fish_user_paths[5]. Vous devez utiliser --universalou il ne fonctionnera pas dans de nouvelles sessions.

Si quelqu'un a le temps, veuillez soumettre un PR au repo avec cet exemple. J'ai ouvert un problème ici .

tldr;

  1. echo $fish_user_paths | tr " " "\n" | nl // récupère le numéro de celui que vous voulez supprimer, par exemple le 5e
  2. set --erase --universal fish_user_paths[5] // efface le 5ème chemin universellement pour qu'il persiste dans les nouvelles sessions
Elijah Lynn
la source
Pourquoi est-ce si mystérieux? Cela ne devrait-il pas être une fonctionnalité intégrée et ajoutée à la documentation pour que les gens n'aient pas à Google et se retrouvent ici?
Eh
Je pense que si nous prenons la réponse de @ clozach ici superuser.com/a/1212305/30982 , qui est la fonction addpaths () et removepath (), et ouvrons un PR, ce serait la première étape pour l'ajouter. La plupart des mainteneurs sont assez bons pour travailler, l'un me semble grincheux, mais dans l'ensemble, je pense que nous aurions de bonnes chances. Voilà donc notre prochaine étape.
Elijah Lynn
9

Comme le dit Elijah, la meilleure pratique consiste à modifier le fish_user_pathsplutôt que le global PATH. Pour éviter d'avoir à refaire ça sur Google…

  1. Créez quelques fonctions qui ne modifient quefish_user_paths
  2. Rendre les deux fonctions à chargement automatique

Pour ajouter aux chemins utilisateur:

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

Pour supprimer un chemin utilisateur s'il existe (crédit partiel à cela ):

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

Et bien sûr, pour les rendre à chargement automatique :

funcsave addpaths; funcsave removepath

Exemple d'utilisation:

> 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
la source
Remarque: Je viens de découvrir que cette approche ne supprimera pas un chemin ajouté via un autre mécanisme; Un nettoyage de fichier dot peut être en ordre si vous trouvez un chemin d'accès à chaque fois que vous ouvrez une nouvelle session de terminal.
clozach
C'est super, juste ajouté à mon local!
Elijah Lynn
3

Cela devrait effacer les chemins 6 à travers le dernier chemin:

set -e PATH[6..-1]

Le drapeau -e est effacé. Tu vois help set.

alxrsngrtn
la source
cela ne fonctionnera que pour la session en cours
Daniel