web-dev-qa-db-fra.com

Ajouter un chemin relatif vers $ PATH au démarrage de fish

Je veux ajouter le répertoire ./bin (qui est relatif au répertoire Shell actuel) à $ PATH au démarrage de fish. Notez que fish est un Shell.

echo $PATH
set PATH ./bin $PATH
echo $PATH

Si je place ces lignes à l'intérieur ~/.config/fish/config.fish le Shell fera écho à la même collection de chemins. Les chemins absolus sont ajoutés correctement.

Si j'ouvre le Shell et tape le même set PATH ./bin $PATH à l'intérieur d'un répertoire contenant bin il est ajouté avec succès. Cependant quand il n'y a pas de bin dans le répertoire courant, cela me montre une erreur.

set: Could not add component ./bin to PATH.
set: Value too large to be stored in data type

J'utilise fish 1.23.1 sur OS X Lion.

35
Simon Perepelitsa

Il semble que fish n'ajoutera pas de chemin de répertoire inexistant à PATH. Cela s'applique également aux chemins relatifs. Mais si vous créez le répertoire bin dans votre répertoire personnel set PATH ./bin $PATH fonctionnera correctement à chaque démarrage car il est exécuté depuis la maison. C'est une sorte de hack cependant.

2
Simon Perepelitsa

La meilleure façon que j'ai trouvée pour constamment ajouter un chemin d'accès à votre $PATH est

set -U fish_user_paths $fish_user_paths ~/path/name

Ceci précède à $PATH. Et comme il est persistant, le chemin reste dans $PATH lors du redémarrage de Shell.

C'est plus efficace que de mettre une commande dans votre config.fish pour modifier votre $PATH, car il ne s'exécute qu'une seule fois par rapport à chaque redémarrage du shell.

La variable fish_user_paths est destiné à être défini par l'utilisateur1, comme l'a déclaré ridiculousfish , le responsable du poisson.


Pensez à créer une fonction poisson pour plus de commodité: 2

# ~/.config/fish/functions/add_to_path.fish
function add_to_path --description 'Persistently prepends paths to your PATH'
  set --universal fish_user_paths $fish_user_paths $argv
end

Et utilisez-le comme:

$ add_to_path foo bar  # Adds foo/ and bar/ to your PATH

Remarques

  1. Sur cette page, l'auteur donne l'exemple set -U fish_user_paths ~/bin. Cela écrase fish_user_paths avec une valeur unique de ~/bin. Pour éviter de perdre des chemins existants définis dans fish_user_paths, assurez-vous d'inclure $fish_user_paths en plus de tous les nouveaux chemins ajoutés (comme vu dans ma réponse).

  2. Mes fichiers dot contiennent une version légèrement plus avancée qui ignore l'ajout de doublons https://github.com/dideler/dotfiles/blob/master/.config/fish/functions/add_to_user_path.fish

62
Dennis

Je n'avais jamais entendu parler de fish avant cela. Je viens de l'installer pour pouvoir l'essayer (et j'ai supprimé quelques paragraphes que j'avais écrits ici avant de réaliser que fish est un Shell).

On dirait set PATH dir-name $PATH est la bonne syntaxe pour ajouter un répertoire à $PATH.

Mais en ajoutant un nom de répertoire relatif à $PATH est presque certainement une mauvaise idée, et votre Shell vous rend service en vous avertissant lorsque le répertoire n'existe pas. (fish est conçu pour être convivial.)

Utilisez plutôt un chemin absolu:

set PATH $PWD/bin $PATH

et vérifiez d'abord si $PWD/bin existe, imprimant un message d'erreur si ce n'est pas le cas.

En ce qui concerne la "set: Value too large to be stored in data type ", pourriez-vous ajouter le répertoire à votre $PATH plusieurs fois? Il devrait y avoir un moyen de vérifier si un répertoire est déjà dans $PATH avant de l'ajouter.

16
Keith Thompson

Je pense que la réponse est qu'en utilisant set -U est un hareng rouge. Ajoutez plutôt ce qui suit à ~/.config/fish/config.fish:

if status --is-interactive
    set PATH $PATH ~/.local/bin;
end
10
dhardy

direnv http://direnv.net/ est un bon utilitaire pour vous aider dans ce que vous faites.

En règle générale, ajouter $ PATH avec ./bin n'est pas sûr, car toute personne disposant d'un accès en écriture à un répertoire partagé peut masquer du code malveillant, par exemple ./bin/ls. Ce code s'exécute lorsque vous exécutez ls dans le répertoire partagé.

direnv ne résout pas ce problème (il fonctionne sur la base de fichiers .envrc, mais n'importe qui pourrait les placer), mais au moins il vous avertit lorsque vous cd dans un répertoire que $ PATH est en train d'être modifié:

$ cd my_project
direnv: loading .envrc
direnv export: ~PATH
5
Florian D