J'utilise zsh
sur Ubuntu et j'ai créé un lien symbolique pour bat
ainsi :
ln -s /usr/bin/batcat /home/user_name/.local/bin/bat
frapper ls -l
depuis ~/.local/bin
affiche :
lrwxrwxrwx 1 tux tux 15 May 19 13:47 bat -> /usr/bin/batcat
Maintenant depuis n'importe quel répertoire (même dans ~/.local/bin
),
Si je lance bat
, j'obtiens command not found: bat
. Exécutant également ~/.local/bin
ne fonctionne pas. Cependant, en exécutant ./bat
(depuis ~/.local/bin
) fonctionne. Exécution de batcat
fonctionne également.
echo $PATH
montre que ~/.local/bin
est dans le chemin
Qu'est-ce qui pourrait mal se passer ici ? aucun lien symbolique ne fonctionne, bat
n'est qu'un exemple
PS Dans bash, tout fonctionne comme prévu
Réponse acceptée :
Si votre PATH
contient en fait ~/.local/bin
avec le caractère tilde littéral :cela ne fonctionnera pas. Le tilde doit être étendu à votre répertoire personnel.
Par exemple, chacune de ces lignes est correcte dans zsh, bash ou tout autre shell de type sh :
PATH=~/.local/bin:$PATH
PATH=$PATH:~/.local/bin
PATH=~/.local/bin:"$PATH"
PATH="$PATH":~/.local/bin
export PATH="$HOME/.local/bin:$PATH"
export PATH="$PATH:$HOME/.local/bin"
Ils fonctionnent parce que ~
est étendu au répertoire personnel lorsqu'il se trouve au début d'un mot, immédiatement après le signe égal dans une affectation ou immédiatement après un :
dans la partie droite d'une affectation (le but de cette dernière règle est précisément de faciliter le réglage de PATH
).
Mais une ligne comme PATH="~/.local/bin:$PATH"
ne fonctionnera pas, car ~
n'est pas développé entre guillemets doubles, donc la valeur de PATH
finit par contenir le caractère littéral ~
. Ce PATH
fait référence à un répertoire appelé ~
dans le répertoire courant, pas votre répertoire personnel.
Bash¹ a une fonctionnalité dans laquelle ~
est interprété comme le répertoire personnel au début des entrées de chemin. Donc PATH="~/.local/bin:$PATH"
fonctionne partiellement dans bash. Cependant, cela ne fonctionne que lorsque vous exécutez un programme directement à partir de bash, pas lorsque des programmes autres que bash eux-mêmes démarrent des programmes. Donc, même si vous utilisez bash, ne mettez pas un ~
littéral dans le chemin, assurez-vous qu'il est développé ou utilisez $HOME
à la place.