Bash - La variable d'environnement PATH

baissaoui Messages postés 497 Date d'inscription jeudi 2 septembre 2021 Statut Webmaster Dernière intervention 22 mars 2024 - 23 juin 2022 à 15:30
Document initial créé par lami20j

La variable d'environnement PATH


I. Préambule

Sous les systèmes GNU/Linux qu'on le veuille ou non, nous devenons des administrateurs de notre système. De plus en plus, on voit sous GNU/Linux l'apparition d'utilitaires graphiques permettant d'exécuter des tâches d'administration.

Cependant, l'obscure ligne de commande connue sous plusieurs appellations (shell, terminal, console, etc.) reste un utilitaire très puissant et facile à manipuler.

Une fois les bases apprises, vous serez étonné de la facilité d'utilisation de la ligne de commande.

<parenthèse>
L'emploi de la ligne de commande reste beaucoup plus rapide que l'utilisation d'un utilitaire graphique. Si vous comptez le temps de chargement de l'interface, la recherche (physique) de la souris sur votre bureau, et sans compter que par ailleurs vous serez tout de même obligé de faire de la saisie, alors vous vous priverez de quelques avantages que vous offre ladite "ligne de commande", et de ce fait, vous ne bénéficierez ni de la touche tab pour la complétion de commande, ni de l'historique vous permettant de répéter une commande, ni d'alias pour les commandes longues, etc.

L'inconvénient pour le shell sera le fait que vous ne pourrez pas tenir votre tasse de café ou la cigarette dans une main tandis que l'autre sera en train de saisir au clavier.
Avec la souris c'est faisable, jusqu'au moment où vous devrez remplir les zones proposées par votre cher utilitaire graphique.

Mais peut être qu'avec le shell arrêterez-vous de fumer...
Le shell est moins cher que Niquitin, etc.?!

Mais vous êtes toujours sous GNU/Linux et le choix vous appartient.
</parenthèse>

Comme la liberté a un prix, ben, il faut le payer.
Dans le cas des systèmes GNU/Linux le prix à payer est la liberté de lire la documentation disponible sur votre système, voir les pages "man" et la commande "info", pour mieux exploiter votre système.

On peut aussi voir le pages "man" avec le navigateur Konqueror en utilisant l'URL man:/
Sur Internet on trouve des traductions en français pour les pages "man".
www.linux-france.org
www.linux-kheops.com
manpagesfr.free.fr

II. C'est quoi le shell ?

C'est un logiciel qui fait partie du système et qui a le rôle de traiter des commandes ou lignes de commandes entrées au clavier.

Pour voir la liste des shells disponibles sur votre système, consultez le ficher /etc/shells
cat /etc/shells
Un utilisateur sous Linux détient par défaut un shell de connexion.

Consultez le fichier /etc/passwd et vous verrez que le dernier champ est quelque chose du genre /bin/<quelquechose>. Il s'agit de votre shell de connexion.

Pour voir les shells des utilisateurs, on peut utiliser la commande
cat /etc/passwd | cut -d: -f1,7
Pour un utilisateur en particulier, on complétera la commande de cette manière :
cat /etc/passwd | cut -d: -f1,7 | grep utilisateur


Si vous êtes en mode graphique vous pouvez ouvrir un terminal (xterm,gterm,konsole,...) et ensuite écrire vos lignes de commandes.

A savoir que sous GNU/Linux on dispose de 6 consoles virtuelles, dont l'accès depuis l'interface graphique se fait avec les combinaisons de touches suivantes Ctrl+ALT+Fn ou
n est un chiffre de 1 à 6.

Depuis une console virtuelle, vous pouvez passer dans une autre avec la combinaison ALT+Fn, (avec n de 1 à 6).
Pour revenir en mode graphique depuis une console virtuelle, faites ALT+F7.

Dans un shell, on voit une invite de commande (prompt) du genre :
utilisateur@debian: ~$

Si à la place de $ vous voyez un #, alors sachez que vous êtes connecté en tant que root, à moins que vous n'ayez modifié votre configuration.

L'invite de commande diffère en fonction du système d'exploitation et peut être modifié grâce à une autre variable d'environnement PS1.

III. Définition

Commençons d'abord avec le terme générique de variable.

Une variable, c'est un conteneur mémoire qui stocke une donnée qui pourra changer pendant l'exécution d'un programme.

Donc une variable a un nom et un contenu. Nous n'entrerons pas dans les détails de la programmation pour expliquer le type de variable et leur contenu.

Nous nous contenterons pour l'instant de savoir que la variable dont on parle s'appelle PATH et que son contenu est une chaîne qui contient des chemins de répertoires séparés par deux-points :

Pour afficher le contenu d'une variable dans le shell, vous devez écrire
echo $variable
Dans le cas de la variable PATH, vous devrez écrire
echo $PATH
IMPORTANT! Respectez la casse. GNU/Linux différencie les MAJUSCULES des minuscules.

Pour un affichage plus agréable vous pouvez utiliser la commande
echo $PATH | tr : \\n
Voici d'autres façons pour afficher le contenu de PATH (à titre indicatif, juste pour vous signaler qu'il existe presque toujours, plusieurs alternatives pour arriver à ses fins...).
printenv PATH
env | grep -i PATH | cut -d= -f2
perl -e 'print $ENV{PATH},"\n"'
perl -e '$,="\n" and print split(":",$ENV{PATH}),""'
perl -e '($_=$ENV{PATH})=~s/:|$/\n/g and print'
Bien sûr que la
plus courte est préférable.

IV. Séance de dissection

On a vu que la variable PATH contient une liste de répertoires séparés par deux-points :

Ce sont les répertoires dans lesquels le shell cherche la commande qu'on écrit au clavier.
La recherche se fait dans l'ordre des répertoires contenus dans la variable PATH.

Exemple :
lami20j@debian: ~$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games:/home/lami20j/bin
Quand on écrit une commande le shell va chercher d'abord dans /usr/local/bin, puis dans /usr/bin, puis dans /usr/bin/X11, puis dans /usr/games et pour finir dans /home/lami20j/bin.
Dès que le shell trouve la commande, alors il stoppe la recherche en exécutant la commande trouvée.

Une commande on peut l'écrire en utilisant :
- son nom
- le chemin absolu ( /bin/cat /etc/passwd )
- le chemin relatif ( on utilise le "." ou ".." en général pour des programmes ou scripts ne se trouvant pas dans PATH)

. c'est le répertoire courant
.. c'est le répertoire parent

En écrivant une commande, on peut se trouver dans plusieurs situations :
1. la commande est unique et se trouve dans un des répertoires
2. la commande n'est pas unique et se trouve dans plusieurs répertoires
3. la commande ne se trouve dans aucun des répertoires

1. Dans le 1er cas, les choses sont simples.
Si vous avez une erreur à l'exécution, c'est sûrement à cause de la syntaxe.
Solution : consulter le manuel de la commande

2. Dans le 2ème cas, les choses ne sont pas non plus compliquées.
Supposons qu'on dispose d'une commande qui se trouve dans /usr/bin et que nous avons installé depuis les sources une version plus récente de la commande dont l'exécutable se trouve dans /usr/local/bin.

Si on appelle la commande par son nom, que se passera-t-il ?

Le shell regarde dans PATH en commençant par le 1er répertoire rencontré.
Dans notre cas, il trouve la commande dans /usr/local/bin donc ce sera /usr/local/bin/prog qui s'exécutera.

En revanche, si on veut tout de même exécuter la commande prog qui se trouve dans /usr/bin, alors il faut utiliser le chemin absolu /usr/bin/prog

3. Le 3ème cas comprend 2 situations

- la commande existe mais ne se trouve dans aucun répertoire de notre PATH
- la commande n'existe pas

Dans les 2 cas, le message d'erreur sera 'command not found'

Mais l'interprétation ne sera pas la même.

Il y a des commandes que seul root peut utiliser.
Solution : connectez vous en root avec su ou su -
linux utiliser la commande su

Il y a des commandes qui se trouvent dans un répertoire qui ne se trouve pas dans votre variable PATH.
Solution: - utiliser le chemin absolu
- ajouter le répertoire à votre PATH

Vous avez créé un script et vous n'arrivez pas à l'exécuter quelque soit le chemin spécifié ?

Solution : - vérifier les droits d'exécution sur le script ( ls -l script )

La commande n'existe pas, en ce cas je suppose que vous savez ce qu'il faut faire. Et si vous ne savez pas, voilà la solution.
Tapez sur les épaules de l'administrateur pour lui demander de vous installer le programme.

On peut chercher l'existence d'une commande en utilisant soit whereis soit which
whereis commande
which -a commande
Dans le cas de which l'option -a nous permet de voir tous les chemins correspondants.
Sans l'option -a ce n'est que le 1er répertoire qui contient la commande qui sera affiché, chose qu'on ne voudra sûrement pas si la commande se trouve dans plusieurs répertoires.

V. Ajouter un répertoire à la variable PATH

- seulement pour la session en cours

Si on veut ajouter par exemple /home/user/mes_prog à la variable PATH, dans le shell écrivez
export PATH=$PATH:/home/user/mes_prog
pour avoir le répertoire en dernier dans PATH.

ou
export PATH=/home/user/mes_prog/:$PATH
pour avoir votre répertoire en premier dans PATH.

Maintenant, vous pouvez utilisez votre programme en écrivant tout simplement son nom.

A la déconnexion PATH reprendra sa valeur par défaut, donc /home/user/mes_prog n'existera plus dans PATH.

- de manière permanente

Si vous voulez configurer PATH de façon permanente, vous devez éditer le fichier de configuration de votre shell de connexion.
Comme le plus souvent c'est le shell BASH qui est utilisé, vous devez éditer votre fichier /home/user/.bashrc.

Pour ça, vous utiliserez un éditeur de texte ou tout simplement une commande pour vous faciliter la tâche.
Eh oui, souvent l'utilisation de la ligne de commande rend les choses bien plus facile que l'utilisation de la souris, surtout dans les tâches d'administration (opinion perso).

Voila la commande
echo 'export PATH=$PATH:/home/user/mes_prog' >> /home/user/.bashrc 
Ainsi à chaque connexion votre PATH contiendra votre répertoire /home/user/prog

Cette opération peut être exécutée par l'utilisateur user vu qu'il s'agit de son environnement.

VI. Et puis...

La variable PATH n'est qu'une variable parmi plusieurs dizaines que contient le shell.

Vous pouvez afficher les variables de votre environnement sans se soucier de leur nom (que peut être vous ne connaissez même pas).

Pour faire ça vous avez à votre disposition plusieurs commandes

printenv
env
set
export