Les membres ayant 30 points peuvent parler sur les canaux annonces, projets et hs du chat.
La shoutbox n'est pas chargée par défaut pour des raisons de performances. Cliquez pour charger.

Forum Casio - Vos tutoriels et astuces


Index du Forum » Vos tutoriels et astuces » TDM 20 : Comprendre et utiliser le PATH sous Linux
Lephenixnoir En ligne Administrateur Points: 24671 Défis: 170 Message

TDM 20 : Comprendre et utiliser le PATH sous Linux

Posté le 27/01/2021 14:27

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


Ne0tux Hors ligne Membre d'honneur Points: 3525 Défis: 265 Message

Citer : Posté le 29/01/2021 11:06 | #


Merci pour ce tuto !

Cette notion existe sous Windows et même parfois pour des environnements (est-ce le bon mot ?) de programmation tels que Python, Java, Matlab etc. Le principe reste le même et on peut se retrouver avec plusieurs "path" différents sur un seul et même OS. Je ne connais pas le formalise pour vraiment décrire l'idée, j'espère que c'est compréhensible.

Du moment qu'on comprend l'article appliqué à Linux, ça va tout seul pour le reste.
Mes principaux jeux : Ice Slider - CloneLab - Arkenstone

La Planète Casio est accueillante : n'hésite pas à t'inscrire pour laisser un message ou partager tes créations !
Lephenixnoir En ligne Administrateur Points: 24671 Défis: 170 Message

Citer : Posté le 29/01/2021 11:11 | #


C'est vrai, beaucoup de systèmes ont leurs propres chemin. Python a son chemin qu'on peut manipuler avec sys.path ou la variable d'environnement PYTHON_PATH, dans lequel il cherche les modules pour import. CMake a son chemin qu'on peut manipuler avec la variable CMAKE_MODULE_PATH, dans lequel il cherche les modules pour include(). Et bien d'autres, évidemment. Souvent on peut le faire avec une variable d'environnement donc la méthode ci-dessus aide dans pas mal de cas.

Au fond cet article ne parle que du PATH du shell (même s'il n'est pas strictement limité au shell parce que la libc s'en sert aussi dans execvp() et execvpe()).
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)

LienAjouter une imageAjouter une vidéoAjouter un lien vers un profilAjouter du codeCiterAjouter un spoiler(texte affichable/masquable par un clic)Ajouter une barre de progressionItaliqueGrasSoulignéAfficher du texte barréCentréJustifiéPlus petitPlus grandPlus de smileys !
Cliquez pour épingler Cliquez pour détacher Cliquez pour fermer
Alignement de l'image: Redimensionnement de l'image (en pixel):
Afficher la liste des membres
:bow: :cool: :good: :love: ^^
:omg: :fusil: :aie: :argh: :mdr:
:boulet2: :thx: :champ: :whistle: :bounce:
valider
 :)  ;)  :D  :p
 :lol:  8)  :(  :@
 0_0  :oops:  :grr:  :E
 :O  :sry:  :mmm:  :waza:
 :'(  :here:  ^^  >:)

Σ π θ ± α β γ δ Δ σ λ
Veuillez donner la réponse en chiffre
Vous devez activer le Javascript dans votre navigateur pour pouvoir valider ce formulaire.

Si vous n'avez pas volontairement désactivé cette fonctionnalité de votre navigateur, il s'agit probablement d'un bug : contactez l'équipe de Planète Casio.

Planète Casio v4.3 © créé par Neuronix et Muelsaco 2004 - 2024 | Il y a 83 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements

Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd