103.1 Leçon 2
Certification : |
LPIC-1 |
---|---|
Version : |
5.0 |
Thème : |
103 Commandes GNU et Unix |
Objectif : |
103.1 Travailler en ligne de commande |
Leçon : |
2 sur 2 |
Introduction
L’environnement d’un système d’exploitation comprend les outils de base - comme les interpréteurs de commandes et éventuellement une interface graphique - dont vous aurez besoin pour travailler. Mais votre environnement sera également doté d’un ensemble de raccourcis et de valeurs prédéfinies. Nous allons apprendre ici à lister, invoquer et gérer ces valeurs.
Trouver vos variables d’environnement
Comment identifier les valeurs courantes de chacune de nos variables d’environnement ? Une façon de le faire est d’utiliser la commande env
:
$ env DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus XDG_RUNTIME_DIR=/run/user/1000 XAUTHORITY=/run/user/1000/gdm/Xauthority XDG_CONFIG_DIRS=/etc/xdg/xdg-ubuntu:/etc/xdg PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin GJS_DEBUG_TOPICS=JS ERROR;JS LOG [...]
Vous obtiendrez beaucoup de résultats, bien plus que ce qui est inclus dans l’extrait ci-dessus. Mais pour l’instant, notez l’entrée PATH
, qui contient les répertoires où votre shell (et d’autres programmes) vont chercher d’autres programmes sans avoir à spécifier le chemin complet. Avec cette configuration, vous pouvez exécuter un programme binaire qui se trouve, disons, dans /usr/local/bin
depuis votre répertoire personnel et il fonctionnera comme si le fichier était local.
Changeons de sujet un instant. La commande echo
affiche à l’écran tout ce que vous lui fournissez en argument. Eh bien, il y aura bien des fois où faire répéter littéralement quelque chose à echo
nous sera très utile.
$ echo "Hi. How are you?" Hi. How are you?
Mais il y a autre chose que vous pouvez faire avec echo
. Lorsque vous lui fournissez le nom d’une variable d’environnement — et que vous lui indiquez qu’il s’agit d’une variable en préfixant le nom de la variable par un $
— alors, au lieu de simplement afficher le nom de la variable, l’interpréteur de commandes la développera en vous donnant sa valeur. Vous ne savez pas si votre répertoire préféré est actuellement dans le chemin ? Vous pouvez le vérifier rapidement en passant par echo
:
$ echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
Créer de nouvelles variables d’environnement
Vous pouvez ajouter vos propres variables personnalisées à votre environnement. La méthode la plus simple consiste à utiliser le caractère =
. La chaîne de caractères à gauche sera le nom de votre nouvelle variable et la chaîne de caractères à droite sera sa valeur. Vous pouvez dorénavant passer le nom de la variable à echo
pour confirmer que ça a marché :
$ myvar=hello $ echo $myvar hello
Note
|
Vous remarquerez qu’il n’y a pas d’espace de part et d’autre du signe égal dans l’affectation des variables. |
Mais est-ce que ça a vraiment marché ? Tapez bash
dans le terminal pour lancer un nouveau shell. Ce nouveau shell ressemble exactement à celui que vous venez d’utiliser, mais il est en fait un enfant du shell original (que nous appelons le parent). Maintenant, à l’intérieur de ce nouveau shell enfant, essayez de faire fonctionner echo
comme avant. Rien. Que se passe-t-il ?
$ bash $ echo $myvar $
Une variable que vous créez de la façon que nous venons de décrire ne sera disponible que localement, dans la session actuelle du shell. Si vous lancez un nouveau shell — ou si vous fermez la session en utilisant exit
— la variable ne vous suivra pas. En tapant exit
ici, vous retrouvez votre shell parent d’origine qui, pour l’instant, est l’endroit où nous voulons être. Vous pouvez relancer echo $myvar
si vous voulez, juste pour vérifier que la variable est toujours disponible. Maintenant, tapez export myvar
pour transmettre la variable à tous les shells enfants que vous pourrez ouvrir par la suite. Essayez : tapez bash
pour lancer un nouveau shell et ensuite echo
:
$ exit $ export myvar $ bash $ echo $myvar hello
Tout cela peut sembler un peu bête lorsque l’on crée des shells sans objectif valable. Mais comprendre comment les variables de l’interpréteur de commandes se propagent dans votre système deviendra très important lorsque vous commencerez à écrire des scripts concrets.
Supprimer des variables d’environnement
Vous voulez savoir comment faire le ménage dans toutes ces variables éphémères que vous avez créées ? Une solution consiste tout simplement à fermer votre shell parent - ou à redémarrer votre machine. Mais il y a plus simple. Comme unset
, par exemple. Taper unset
(sans le $
) va détruire la variable. echo
nous le prouvera.
$ unset myvar $ echo $myvar $
S’il y a une commande unset
, il y a fort à parier qu’il existe une commande set
qui va avec. Exécuter set
tout seul affichera beaucoup de choses, et ce ne sera pas très différent de ce que env
nous a donné. Regardez la première ligne du résultat lorsque vous filtrez avec le terme PATH
:
$ set | grep PATH PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin [...]
Quelle est la différence entre set
et env
? En ce qui nous concerne, l’essentiel est que set
affiche toutes les variables et toutes les fonctions. Prenons un exemple. Nous allons créer une nouvelle variable appelée mynewvar
et confirmer qu’elle est bien là :
$ mynewvar=goodbye $ echo $mynewvar goodbye
Maintenant, lancer env
en utilisant grep
pour filtrer la chaîne mynewvar
n’affichera rien. Mais en exécutant set
de la même manière, nous verrons notre variable locale.
$ env | grep mynewvar $ set | grep mynewvar mynewvar=goodbye
Guillemets et échappement des caractères spéciaux
Le moment est venu de vous présenter le problème des caractères spéciaux. En temps normal, les caractères alphanumériques (a-z et 0-9) seront lus littéralement par Bash. Si vous essayez de créer un nouveau fichier appelé myfile
, il vous suffit de taper touch
suivi de myfile
et Bash saura quoi en faire. Mais si vous voulez inclure un caractère spécial dans votre nom de fichier, ça se complique un peu.
Pour illustrer cela, nous allons taper touch
et enchaîner avec le nom : my big file
. Le problème, c’est qu’il y a deux espaces entre les mots que Bash va interpréter. Même si, techniquement, un espace n’est pas un "caractère", il en est un dans le sens où Bash ne le lira pas littéralement. Si vous affichez le contenu de votre répertoire actuel, au lieu d’un fichier appelé my big file
, vous verrez trois fichiers nommés respectivement my
, big
et file
. En effet, Bash considère que vous souhaitez créer une série de fichiers dont vous fournissez les noms dans une liste :
$ touch my big file $ ls my big file
Les espaces seront interprétés de la même manière si vous supprimez (rm
) les trois fichiers en une seule commande :
$ rm my big file
Maintenant, essayons de procéder de la bonne manière. Tapez touch
et les trois parties de votre nom de fichier, mais cette fois-ci, mettez le nom entre guillemets. Cette fois-ci ça a marché. Lorsque vous affichez le contenu du répertoire, vous voyez un seul fichier avec le nom approprié.
$ touch "my big file" $ ls 'my big file'
Il existe d’autres façons d’obtenir le même résultat. Les guillemets simples, par exemple, fonctionnent tout aussi bien que les guillemets doubles. (Notez que les guillemets simples préservent la valeur littérale de tous les caractères, tandis que les guillemets doubles préservent tous les caractères sauf $
, `
, \
et, dans certains cas, !
).
$ rm 'my big file'
En faisant précéder chaque caractère spécial d’une barre oblique inversée, on "échappe" à la spécificité du caractère et Bash le lira littéralement.
$ touch my\ big\ file
Exercices guidés
-
Utilisez la commande
export
pour ajouter un nouveau répertoire à votre PATH (ceci ne survivra pas à un redémarrage). -
Utilisez la commande
unset
pour supprimer la variablePATH
. Essayez de lancer une commande en utilisantsudo
(commesudo cat /etc/shadow
). Que s’est-il passé ? Pourquoi ? (Quittez votre shell pour rétablir le bon fonctionnement des choses.)
Exercices d’approfondissement
-
Faites des recherches sur Internet pour trouver et étudier la liste complète des caractères spéciaux.
-
Essayez d’exécuter des commandes en utilisant des chaînes composées de caractères spéciaux et en utilisant différentes méthodes d’échappement. Est-ce que ces méthodes se comportent différemment ?
Résumé
Dans cette leçon, vous avez appris à :
-
Comment identifier les variables d’environnement de votre système.
-
Comment créer vos propres variables d’environnement et les exporter vers d’autres shells.
-
Comment supprimer des variables d’environnement et comment utiliser les commandes
env
etset
. -
Comment échapper les caractères spéciaux pour que Bash les lise littéralement.
Les commandes suivantes ont été abordées dans cette leçon :
echo
-
Affiche les chaînes et les variables données.
env
-
Affiche et modifie vos variables d’environnement.
export
-
Passe une variable d’environnement aux shells enfants.
unset
-
Supprime les valeurs et les attributs des variables et des fonctions du shell.
Réponses aux exercices guidés
-
Utilisez la commande
export
pour ajouter un nouveau répertoire à votre PATH (ceci ne survivra pas à un redémarrage).Vous pouvez ajouter temporairement un nouveau répertoire (par exemple un répertoire appelé
myfiles
qui se trouve dans votre répertoire personnel) à votre PATH en utilisantexport PATH="/home/yourname/myfiles:$PATH"
. Créez un script simple dans le répertoiremyfiles/
, rendez-le exécutable, et essayez de le lancer depuis un autre répertoire. Ces commandes partent du principe que vous êtes dans votre répertoire personnel qui contient un répertoire appelémyfiles
.$ touch myfiles/myscript.sh $ echo '#!/bin/bash' >> myfiles/myscript.sh $ echo 'echo Hello' >> myfiles/myscript.sh $ chmod +x myfiles/myscript.sh $ myscript.sh Hello
-
Utilisez la commande
unset
pour supprimer la variablePATH
. Essayez de lancer une commande en utilisantsudo
(commesudo cat /etc/shadow
). Que s’est-il passé ? Pourquoi ? (Quittez votre shell pour rétablir le bon fonctionnement des choses.)En tapant
unset PATH
, vous supprimerez les paramètres actuels du PATH. Toute tentative d’invoquer un binaire sans son chemin complet va échouer. Pour cette raison, la tentative d’exécuter une commande en utilisant sudo (qui est lui-même un programme binaire situé dans/usr/bin/sudo
) va échouer — à moins que vous ne spécifiez l’emplacement absolu, comme dans :/usr/bin/sudo /bin/cat /etc/shadow
. Vous pouvez réinitialiser votrePATH
en utilisantexport
ou en quittant simplement le shell.
Réponses aux exercices d’approfondissement
-
Faites des recherches sur Internet pour trouver et étudier la liste complète des caractères spéciaux.
Voici la liste :
& ; | * ? " ' [ ] ( ) $ < > { } # / \ ! ~
. -
Essayez d’exécuter des commandes en utilisant des chaînes composées de caractères spéciaux et en utilisant différentes méthodes d’échappement. Est-ce que ces méthodes se comportent différemment ?
L’échappement à l’aide des caractères
"
préservera les valeurs spéciales du signe dollar, de la quote inversée et de la barre oblique inversée. L’échappement à l’aide d’un caractère'
, par contre, rendra tous les caractères littéralement.$ echo "$mynewvar" goodbye $ echo '$mynewvar' $mynewvar