31.10.26
Tilde dans PATH : comprendre et corriger l’erreur11 min de lecture2 248 mots

Tilde dans PATH : comprendre et corriger l’erreur

Une tilde entre guillemets dans PATH reste littérale et peut créer un chemin relatif inattendu. Comprenez le piège, vérifiez votre configuration et corrigez-la.

tilde dans PATHvariable PATH Linuxexpansion de tilde Bashconfiguration zshsécurité du PATH
Tilde dans PATH : comprendre et corriger l’erreur

Pourquoi une tilde dans votre PATH peut désigner le mauvais répertoire

Vous avez ajouté ~/.local/bin à votre variable PATH pour retrouver facilement les outils installés dans votre dossier personnel. Sur le papier, la ligne est bonne. Et pourtant, un programme inattendu apparaît - ou un outil de sandboxing signale que le chemin est accessible en écriture.

Souvent, la cause est plus bête qu'on ne l'imagine : une tilde mise entre guillemets n'est pas forcément développée en chemin vers votre répertoire personnel.

Dans un fichier .bashrc, .zshrc ou .profile, la ligne export PATH="$PATH:~/.local/bin" peut donc ajouter une entrée littérale, au lieu de /home/vous/.local/bin (ou /Users/vous/.local/bin). Et ce n'est pas qu'un détail esthétique : PATH sert à trouver des exécutables, et une entrée relative dépend du répertoire depuis lequel vous lancez les commandes.

Je vous montre comment fonctionne l'expansion de la tilde, comment reproduire et diagnostiquer le problème, puis comment corriger votre configuration proprement. La règle simple : dans une affectation de PATH entre guillemets, préférez $HOME à ~.

Ce que fait réellement la tilde dans une affectation

Dans les shells Unix, ~ peut être développée en chemin vers le répertoire personnel de l'utilisateur. Mais ce n'est pas automatique dans tous les contextes. Ce n'est pas une « substitution universelle » qui remplace chaque tilde à chaque endroit.

Bash, par exemple, développe une tilde en début de mot non cité. Il gère aussi certains cas dans les affectations de variables : une tilde non citée au début d'une affectation, ou juste après un deux-points, peut être développée. Le deux-points compte, parce qu'il sépare les entrées de PATH.

Comparez ces deux écritures :

export PATH="$PATH:~/.local/bin"

export PATH="$PATH:$HOME/.local/bin"

Dans la première ligne, les guillemets englobent l'expression entière. La tilde fait donc partie d'une chaîne citée ; Bash ne la développe pas en chemin vers le dossier personnel.

Dans la seconde, $HOME est explicitement demandé. Les guillemets protègent l'évaluation (et évitent que des caractères spéciaux cassent l'affectation), tout en laissant la variable s'étendre.

En bref : les guillemets doubles ne « désactivent pas tout ». $HOME reste interprété. La tilde, elle, suit des règles plus strictes - et c'est là que ça piège facilement.

Pourquoi la version sans guillemets peut sembler fonctionner

On voit aussi souvent :

export PATH=$PATH:~/.local/bin

Dans Bash et Zsh, ça peut marcher : la tilde placée après un deux-points dans l'affectation est parfois développée. Mais ce n'est pas une bonne idée pour autant. Sans guillemets, la valeur de $PATH peut subir un découpage en mots et des effets indésirables selon ce qu'il y a dedans. Au final, la ligne devient fragile, et « ça marche chez moi » finit par se retourner contre vous.

Si votre objectif est une config lisible et robuste, gardez les guillemets et écrivez $HOME.

Les règles exactes varient selon le shell et le contexte d'exécution. Un fichier lu en session interactive n'est pas forcément traité comme un script. Et un service peut démarrer avec un shell différent de celui de votre terminal. Donc, pour éviter les surprises, ne comptez pas sur une expansion implicite de ~ dans PATH.

Comment une entrée incorrecte de PATH est interprétée

PATH est une liste de répertoires séparés par des deux-points. Quand vous lancez une commande sans chemin complet, le shell parcourt ces répertoires dans l'ordre et cherche un exécutable portant le bon nom.

~/.local/bin n'est pas « reconverti » automatiquement au moment où le shell lit PATH. Si la tilde n'a pas été développée au moment de l'affectation, l'entrée reste littérale.

Comme elle ne commence pas par /, elle devient relative au répertoire de travail courant. Le shell peut donc chercher un fichier dans un chemin du type ./~/.local/bin.

Le résultat peut être trompeur : ce n'est pas forcément ignoré et ça ne déclenche pas forcément une erreur visible. Si un dossier nommé ~ existe (par hasard) dans le répertoire courant et contient l'exécutable attendu, la commande « marche ». Puis elle « ne marche plus » plus tard - selon l'endroit d'où vous lancez.

Reproduire le comportement dans un répertoire de test

Voici une démo simple et volontairement trompeuse. Elle crée un dossier ~ dans le répertoire courant :

mkdir -p ./~/.local/bin

printf '#include <stdio.h>\nint main() { puts("bonjour"); }\n' > a.c

gcc a.c -o ./~/.local/bin/demo

PATH="~/.local/bin" demo

Si la compilation réussit, la commande demo peut s'exécuter alors que le binaire est dans ./~/.local/bin - pas dans votre dossier personnel. La clé ici : PATH est mis entre guillemets, donc la tilde reste littérale, et l'entrée relative pointe vers ce dossier créé pour le test.

Ne faites pas ça dans un répertoire qui contient quelque chose d'important : la démo crée un répertoire et des fichiers. Vous pouvez vérifier avec pwd puis avec find ./~ -type f, et supprimer le dossier de test après.

Pourquoi le contexte courant change le résultat

Un chemin relatif est évalué à partir du répertoire de travail du processus, pas depuis l'emplacement de .bashrc ou .zshrc. Un terminal ouvert dans votre dossier personnel, une commande lancée depuis un dépôt Git, ou un service démarré par le système ne regardent pas forcément la même base.

C'est pour ça que le bug paraît « intermittent ». Vous ne verrez peut-être jamais le dossier ./~ dans l'usage quotidien, puis il apparaît quand vous lancez un outil depuis un autre endroit.

Le PATH ne « change pas magiquement » : ce qui change, c'est la base utilisée pour interpréter cette entrée relative.

Comment vérifier et corriger votre configuration

Commencez par inspecter la valeur réelle de PATH, pas seulement « ce que vous croyez avoir écrit ».

Pour repérer rapidement une tilde dans PATH :

echo "$PATH" | grep -- '~'

Pour afficher chaque entrée séparément (pratique quand la variable est longue) :

printf '%s' "$PATH" | tr ':' '\n' | grep -- '~'

Si vous voyez une ligne avec ~, gardez en tête : ce n'est pas automatiquement une catastrophe dans tous les cas. Mais une entrée du type ~/.local/bin est un bon indice qu'une expansion n'a pas eu lieu comme prévu.

Vous pouvez aussi afficher toutes les entrées sans filtrage :

printf '%s' "$PATH" | tr ':' '\n'

Ensuite, cherchez la partie ajoutée par votre configuration. Selon le shell, il s'agit souvent de ~/.bashrc, ~/.zshrc ou ~/.profile. Quel fichier est réellement lu dépend du shell, de la façon dont la session a été démarrée, et de la machine.

Si vous ne savez pas par où passer, vérifiez le shell en cours avec ps -p $$ -o comm= et regardez les fichiers de configuration pertinents.

Remplacer la tilde par HOME

La correction la plus simple :

export PATH="$PATH:$HOME/.local/bin"

$HOME désigne le dossier personnel dans l'environnement du processus, et l'expansion marche sans ambiguïté dans des guillemets doubles.

Rechargez ensuite le bon fichier (ou ouvrez un nouveau terminal). Par exemple, pour Bash :

source ~/.bashrc

Pour Zsh :

source ~/.zshrc

Puis vérifiez à nouveau PATH. L'entrée devrait apparaître développée, par exemple /home/alice/.local/bin sur beaucoup de distributions Linux, ou /Users/alice/.local/bin sur macOS. Le format exact dépend de votre système et de votre compte.

Éviter les « rustines » qui masquent le vrai problème

Supprimer temporairement l'entrée fautive dans votre terminal peut dépanner, mais ça ne règle pas le fichier qui la réintroduit au prochain démarrage. L'idée, c'est de corriger la source, puis de vérifier le résultat dans une nouvelle session.

Autre piège : ajouter plusieurs fois le même dossier à PATH en rechargeant des fichiers. Ce n'est pas la cause de la tilde, mais les doublons rendent le diagnostic plus confus et l'ordre de recherche moins évident. Une configuration claire et une seule entrée propre suffisent généralement.

Si votre configuration est partagée entre machines ou utilisateurs, vérifiez aussi que $HOME est bien défini dans le contexte où le fichier est chargé.

Ce que cette erreur implique pour la sécurité et les outils

PATH décide quels exécutables sont trouvés quand vous lancez une commande sans chemin complet. Et comme l'ordre compte, deux dossiers contenant des exécutables du même nom peuvent donner des résultats différents : le premier rencontré gagne.

C'est précisément pour ça que des outils d'audit et de sandboxing s'intéressent aux entrées accessibles en écriture. Si votre PATH contient un chemin ambigu ou relatif, vous pouvez accidentellement autoriser l'exécution de quelque chose que vous n'avez pas prévu.

Une entrée correctement développée en ~/.local/bin pointe vers un emplacement précis. Une entrée littérale relative (comme ~/.local/bin qui n'a pas été développée) dépend du répertoire courant et peut pointer vers un endroit inattendu. Si, dans ce contexte, un exécutable du même nom existe à la première position du PATH, le shell peut le lancer.

Ce n'est pas automatiquement la preuve d'une compromission. Mais c'est une configuration qui mérite d'être clarifiée, parce qu'elle ouvre la porte à des comportements « surprenants ».

C'est aussi dans ce contexte qu'un outil comme nono peut signaler des éléments de PATH accessibles en écriture. Une alerte mentionnant ~/.local/bin/ vaut la peine, mais la forme affichée ne suffit pas : il faut vérifier la valeur effective de PATH, l'ordre, et ce que l'outil considère comme modifiable.

Le bon réflexe n'est pas de désactiver l'alerte sur-le-champ, ni de conclure trop vite à une faille grave. Vérifiez plutôt : résolution du chemin, permissions, et où ça se place dans l'ordre du PATH. Un bon avertissement précise généralement si l'entrée est relative, vers quel chemin elle se résout, et pourquoi elle est considérée modifiable. Sinon, l'alerte donne une piste, pas un verdict.

Une vérification rapide avant de conclure

Si une entrée de PATH vous semble suspecte, procédez dans cet ordre :

  1. Affichez les entrées séparément avec printf '%s' "$PATH" | tr ':' '\n'.
  2. Repérez les éléments relatifs (notamment ceux qui ne commencent pas par /).
  3. Retrouvez la ligne qui construit PATH dans les fichiers de configuration effectivement lus.
  4. Remplacez ~ par $HOME dans l'affectation.
  5. Rechargez la configuration et testez dans une nouvelle session.
  6. Si l'outil de sécurité alerte de nouveau, vérifiez aussi les permissions et l'ordre des entrées.

Cette méthode évite deux erreurs classiques : corriger uniquement la session en cours sans toucher à la configuration persistante, ou traiter toute entrée modifiable comme une menace sans vérifier si elle est réellement utilisée pour lancer des commandes.

Pour aller plus loin sur les règles du shell, consultez la documentation de Bash sur l'expansion de la tilde. L'histoire à l'origine de cet article est aussi racontée dans l'article de référence sur la tilde dans PATH.

Conclusion

Une tilde dans PATH n'est pas forcément développée : dans une affectation citée, elle peut rester un simple caractère. Du coup, l'entrée devient relative au répertoire courant et votre comportement peut changer selon l'endroit d'où vous lancez les commandes.

La correction est directe : écrivez export PATH="$PATH:$HOME/.local/bin", rechargez le bon fichier, puis vérifiez le contenu de PATH ligne par ligne. Si un outil de sandboxing vous alerte sur un chemin « accessible en écriture », traitez-le comme un point de départ : vérifiez comment le chemin se résout et quelles permissions s'y appliquent.

Prenez quelques minutes pour relire vos fichiers .bashrc, .zshrc et .profile. Ce petit détail évite un bug discret, vraiment pénible à diagnostiquer, et inutile à conserver.

Questions frequentes

Dans le terminal, `~` apparaît souvent au début d’un mot non cité et peut être développée. Dans une affectation entièrement entre guillemets doubles, comme `PATH="$PATH:~/.local/bin"`, elle reste littérale. Utilisez `$HOME` à la place.
Elle peut fonctionner dans Bash et Zsh grâce à l’expansion de tilde après un deux-points dans certaines affectations. Sans guillemets, la valeur est toutefois plus sensible au découpage et aux caractères spéciaux. Préférez `export PATH="$PATH:$HOME/.local/bin"`.
Pas automatiquement. Si la tilde est littérale, l’entrée est relative au répertoire courant et peut conduire à un exécutable inattendu si le chemin existe. Vérifiez la valeur effective, l’ordre des entrées et les permissions avant de conclure.
Affichez ses entrées avec `printf '%s' "$PATH" | tr ':' '\n'`. Le répertoire personnel doit apparaître sous sa forme développée, par exemple `/home/alice/.local/bin`, et non commencer par `~`. Contrôlez aussi le fichier de configuration.

Articles similaires