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.
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.
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
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).
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
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.
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
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