|
Tutoriel rédigé le : 2021-01-27 14:51 par Lephenixnoir Catégorie : Tutoriels du Mercredi Calculatrice : Toutes
Discutez de ce tutoriel sur le forum >> Voir le sujet dédié (2 commentaires) TDM 20 : Comprendre et utiliser le PATH sous Linux Le Tutoriel du Mercredi (TDM) est une idée proposée par Ne0tux, qui recouvre tous les usages de la calculatrice - des applications de Casio à la conception de jeux en passant par la production artistique.
Aujourd'hui, on explique le fonctionnement du PATH et son rôle dans l'installation de logiciels sous Linux.
Niveau ★ ☆ ☆ ☆ ☆
Tags : Linux, Shell
Les membres réguliers du forum sont divisés grossièrement 50%-50% entre Windows et Linux comme système principal. Il n'est donc pas rare de croiser des logiciels à installer sous Linux, et dans mon expérience l'utilisation du PATH est un des points qui pose le plus souvent problème durant ces installations. Je pense qu'il est largement temps d'avoir un petit tutoriel pour expliquer de quoi il retourne et comment s'en servir.
Comme à mon habitude, j'essaie d'expliquer les raisons de fond donc n'hésitez pas à parcourir le tuto même si vous connaissez le PATH, vous pourriez y apprendre quelque chose d'autre.
Introduction au terminal et au shell
Lorsque vous lancez un terminal sous Linux, vous vous retrouvez face à un shell. Le shell est un programme qui vous permet de manipuler des fichiers, lancer des programmes, les faire communiquer... c'est une interface texte qui vous permet d'utiliser tout ce qui est installé sur l'ordinateur.
On utilise le shell en tapant des commandes, ce qui donne par exemple le résultat ci-dessous :
[el@realm ~]$ ls -l ~/Documents/PC/Tutoriels
total 36
-rw-r--r-- 1 el el 20337 May 10 2020 compilation-gcc.txt
drwxr-xr-x 2 el el 4096 Oct 24 2019 exclude
-rw-r--r-- 1 el el 1363 Jan 26 14:52 fxsdk-cmake.txt
-rw-r--r-- 1 el el 764 Jan 26 14:56 linux-path.txt
drwxr-xr-x 2 el el 4096 May 21 2020 mumble
[el@realm ~]$
Dans cet exemple, le shell a commencé par afficher un « prompt » (ou « invite de commandes »), c'est le « [el@realm ~]$ ». Le prompt indique qui je suis (l'utilisateur el sur la machine realm) et où je suis (~, c'est-à-dire mon dossier personnel). On dit « invite de commandes » parce que le shell m'invite à taper une commande pour travailler.
J'ai ensuite tapé la commande « ls -l ~/Documents/PC/Tutoriels », que l'on peut découper en deux parties :
• Le premier mot ls est le nom d'un programme à lancer. ls est un programme qui affiche les contenus d'un répertoire.
• Les autres mots sont des arguments, qui disent au programme ce qu'on veut faire exactement. Ici j'ai indiqué l'option -l (qui signifie long et demande à ls d'afficher des détails) et ~/Documents/PC/Tutoriels, le chemin du dossier dont je veux connaître les contenus.
Le programme ls a ensuite répondu en affichant les contenus du dossier souhaité. ls a généré tout le texte de la ligne « total 36 » à la fin de la ligne « mumble » puis s'est arrêté. La commande étant finie, le shell a affiché de nouveau le prompt pour m'inviter à saisir une autre commande.
Les programmes du shell sont des fichiers
ls n'est pas une commande intégrée au shell. C'est un programme installé indépendamment sur l'ordinateur, et qui dans une situation extrême pourrait ne pas être installé. Et donc une question naturelle se pose : comment le shell a-t-il déterminé si ls était installé, et si oui comment l'a-t-il trouvé ?
Pour répondre à ces questions, il faut comprendre ce que ls est exactement. En fait, ls est un fichier exécutable. Sous Windows, il s'appelerait probablement ls.exe, mais sous Linux les fichiers exécutables n'ont traditionnellement pas d'extension, donc il s'appelle juste ls. C'est un fichier qui contient du code qui affiche les contenus d'un répertoire.
Comme tout fichier, ls est quelque part dans un répertoire. On peut demander au shell où il l'a trouvé avec command -v.
[el@realm ~]$ command -v ls
/usr/bin/ls
[el@realm ~]$
Ici la commande complète est « command -v ls ». Le shell a donc lancé le programme command avec l'option -v et l'argument ls. Lorsque l'option -v est donnée, command cherche un programme et affiche le dossier dans lequel il se trouve. Ici, le chemin complet vers le fichier exécutable ls est donc /usr/bin/ls.
(Note pour les curieux : contrairement à ls, command est un programme intégré au shell et n'est pas donc pas dans un fichier.)
Il en va de même pour tous les programmes, et je peux par exemple trouver le répertoire dans lequel le programme sh-elf-gcc est installé.
[el@realm ~]$ command -v sh-elf-gcc
/home/el/.local/bin/sh-elf-gcc
[el@realm ~]$
Cette fois c'est dans mon dossier personnel (/home/el est mon dossier personnel), dans un sous-dossier caché (le . devant .local en fait un dossier caché).
Maintenant que l'on sait que la plupart des programmes sont des fichiers, on va pouvoir comprendre le PATH.
Le shell cherche les programmes dans les dossiers du PATH
Le PATH (littéralement « chemin » en anglais) est une liste de dossiers. Plus précisément, c'est la liste des dossiers dans laquelle le shell va chercher les programmes. On peut consulter cette liste à l'aide de la commande « echo $PATH » (que j'expliquerai ensuite).
[el@realm ~]$ echo $PATH
/home/el/opt/i686-elf-2.32-8.3.0/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/home/el/bin:/home/el/opt/bin:/home/el/.local/bin
[el@realm ~]$
Les noms des dossiers sont séparés par des deux-points « : ». Il y a 7 dossiers dans mon PATH, ce qui signifie que si je tape une commande « sh-elf-gcc » le shell va regarder si un des 7 fichiers suivants existe (et si oui lancer le premier qui existe) :
• /home/el/opt/i686-elf-2.32-8.3.0/bin/sh-elf-gcc
• /usr/local/sbin/sh-elf-gcc
• /usr/local/bin/sh-elf-gcc
• /usr/bin/sh-elf-gcc
• /home/el/bin/sh-elf-gcc
• /home/el/opt/bin/sh-elf-gcc
• /home/el/.local/bin/sh-elf-gcc
Sur mon ordinateur, les 6 premiers fichiers n'existent pas, et le 7ème existe, donc lorsque je tape sh-elf-gcc dans une commande le shell lance le fichier exécutable /home/el/.local/bin/sh-elf-gcc.
À l'aide de ces nouvelles informations, on peut répondre aux questions de tout à l'heure.
Comment le shell a-t-il déterminé si ls était installé ? Le shell a simplement cherché ls dans chaque dossier du PATH. Le shell ne cherche pas vraiment à savoir si ls est installé, c'est plutôt à ls de s'assurer que son dossier est dans le PATH pour que le shell le trouve.
Si, comment l'a-t-il trouvé ? La valeur du PATH contenait le dossier où se trouve le fichier exécutable ls (c'est-à-dire /usr/bin) et donc le shell a pu trouver ls.
Le dossier d'installation des programmes du forum n'est souvent pas dans le PATH
Le dossier où se trouve ls, /usr/bin, est un dossier système quel seul l'administrateur peut modifier. Normalement il n'y a que le gestionnaire de paquets, un programme chargé de superviser l'installation et la mise à jour de tous les programmes sur l'ordinateur, qui est supposé ajouter des fichiers dans /usr/bin. C'est parce que sous Linux, on n'installe pas des logiciels en téléchargeant un setup.exe sur son site web (ce qui est sauvage). À la place, les logiciels sont distribués sous la forme de « paquets » et installés par le gestionnaire de paquets.
Lorsque quelqu'un crée un programme sur le forum, on pourrait à chaque fois le partager sous forme de paquet pour que les autres membres du forum l'installent avec leur gestionnaire de paquets. Le problème c'est qu'il existe plusieurs genres de paquets et que distribuer des paquets demande beaucoup de temps et d'effort, parfois plus que d'écrire le programme qu'on veut partager ! Certains comme Dark Storm prennent ce temps, d'autres comme moi pensent que ça n'en vaut pas la peine.
En pratique, la plupart des logiciels du forum ne sont pas empaquetés ; du coup on ne peut pas les installer avec le gestionnaire de paquets, et donc on ne peut pas les installer dans le répertoire /usr/bin.
Il faut donc les installer ailleurs, et ce que j'ai vu de plus courant c'est de les installer dans ~/.local/bin. (Rappelez-vous que ~ représente votre dossier personnel, donc c'est dans un sous-dossier .local à côté de Documents, Images, etc. Il est juste caché parce que son nom commence par un point.) C'est un dossier approprié et plus ou moins standardisé pour permettre d'installer des logiciels en-dehors du /usr/bin réservé au gestionnaire de paquets. Si ce n'est pas exactement ~/.local/bin alors ça peut être un autre endroit dans votre dossier personnel.
Il y a cependant un petit problème : lorsque vous installez Linux (ou WSL sous Windows), en général le PATH ne contient pas ~/.local/bin. Ça veut dire que le shell ne trouvera pas les programmes installés là-bas ! À la place, vous aurez une erreur de ce style :
[el@realm ~]$ sh-elf-gcc
bash: sh-elf-gcc: command not found
[el@realm ~]$
Et command -v aussi vous indiquera que le fichier est introuvable en n'affichant rien.
[el@realm ~]$ command -v sh-elf-gcc
[el@realm ~]$
Dans cette situation, il est nécessaire d'ajouter le nouveau dossier d'installation au PATH. Voyons tout de suite comment faire !
Modifier une variable d'environnement, .bashrc et .profile
Pour comprendre comment modifier le PATH, il est utile de comprendre d'abord ce que c'est exactement. Le PATH est une variable d'environnement. Les variables d'environnement indiquent aux programmes lancés sur l'ordinateur dans quel contexte ils sont lancés. Par exemple, la variable d'environnement USER indique qui a lancé le programme, et la variable HOME indique où est le dossier personnel de USER. Les variables d'environnement ont traditionnellement des noms en majuscules, et les valeurs sont juste des chaînes de caractères. PATH est une de ces variables.
Chaque processus a son propre environnement, donc si on veut modifier PATH de façon pérenne il faut le faire d'une façon qui affecte tous les shells. On dispose de deux outils pour ça :
• Le fichier ~/.bashrc est lu par le shell au démarrage d'un terminal, et affecte tous les terminaux ;
• Le fichier ~/.profile est lu par le shell au démarrage de la session, et affecte toute la session, même les programmes lancés hors d'un terminal.
(Note : ces deux fichiers sont utilisés par le shell le plus courant sous Linux, bash. Si vous utilisez un autre shell les noms peuvent varier, mais dans ce cas vous savez certainement déjà vous y prendre.)
Ces deux fichiers sont juste une suite de commandes shell (ça ressemble à un programme). Ce qui nous intéresse, c'est d'y ajouter une commande qui rajoute un dossier au PATH pour que les programmes qu'on installe puissent être trouvés quand on voudra les lancer. La commande qui permet de faire ça est export.
export PATH="$PATH:$HOME/.local/bin"
La syntaxe de la commande est export VARIABLE="VALEUR". Ici, on change la variable d'environnement PATH, et on lui donne la valeur $PATH:$HOME/.local/bin. Lorsque la commande sera lancée $PATH sera remplacé par la valeur actuelle du chemin (comme dans « echo $PATH » tout à l'heure) et donc la nouvelle valeur sera la valeur actuelle à laquelle on ajoute $HOME/.local/bin.
(Dans ce tutoriel, j'ai utilisé de façon interchangeable pour désigner mon dossier personnel « ~ », « $HOME » et « /home/el ». Le troisième est le nom exact et ne marchera pas chez vous (votre nom d'utilisateur est certainement différent). $HOME est la « bonne » façon de désigner le dossier personnel, et elle marche partout. « ~ » est un raccourci pratique mais pour différentes raisons il ne marchera pas dans export. Il faut donc bien utiliser $HOME.)
Je vous conseille de mettre les commandes concernant le PATH dans ~/.profile, car dans de rares occasions vous pouvez vouloir appeler un programme sans ouvrir un terminal, et dans ce cas il faut avoir modifié le PATH au niveau de la session. Vous pouvez le faire en ouvrant le fichier dans un éditeur de texte (si votre explorateur de fichiers ou éditeur de texte ne le montre pas, vous pouvez essayer le raccourci Ctrl+H qui affiche les fichiers cachés dans certains outils). Sinon, comme pour tout, vous pouvez le faire dans un terminal avec la commande suivante.
echo "export PATH=\"\$PATH:MON_DOSSIER\"" >> $HOME/.profile
Remplacez « MON_DOSSIER » par le chemin absolu du dossier, par exemple « $HOME/.local/bin ».
• Si vous modifiez ~/.bashrc, le nouveau PATH sera utilisé automatiquement dans tous les nouveaux terminaux (les terminaux déjà ouverts ne sont pas affectés).
• Si vous modifiez ~/.profile, le nouveau PATH sera utilisé à la prochaine connexion. Fermez votre session ou redémarrez l'ordinateur.
Vous pouvez à tout moment utiliser la commande « echo $PATH » pour inspecter le PATH, et command -v pour rechercher le fichier correspondant à n'importe quel programme.
Conclusion
Le PATH est une liste de dossiers dans lesquels le shell recherche les programmes lorsqu'on exécute des commandes. Lorsqu'on installe des programmes, il faut s'assurer que le dossier d'installation soit dans le PATH, sinon le shell ne trouvera pas les programmes.
Le PATH est une variable d'environnement, que l'on peut modifier à l'échelle de tous les terminaux à l'aide de ~/.bahsrc ou à l'échelle de toute la session à l'aide de ~/.profile. La commande qui ajoute un dossier MON_DOSSIER avec export est la suivante.
export PATH="$PATH:$HOME/.local/bin"
J'espère que ce tutoriel vous aura aidé à comprendre le PATH pour bien gérer l'installation de nouveaux logiciels. o/
Et à bientôt sur Planète Casio !
Consulter le TDM précédent : TDM 19 : Appréhender la mémoire pour éclairer le bas niveau
Consulter l'ensemble des TDM Discutez de ce tutoriel sur le forum >> Voir le sujet dédié (2 commentaires)
|
|