Avertissement
Notre association, dans le cadre de ses ateliers du jeudi a proposé une découverte du shell et de ses commandes. Ce modeste document ne prétend pas rivaliser avec les cours et tutoriels complets et de grande qualité disponibles sur internet. Il risque même de faire dresser les cheveux sur la tête des spécialistes qui se seraient égarés sur notre site. Qu’ils veuillent bien me pardonner ce frémissement capillaire ou cette révélation de leur calvitie.
Je conseille à ceux qui voudraient une information plus complète de consulter les sites et documents proposés dans la liste non exhaustive ci-dessous :
- Tout d’abord le document proposé par OpenClassRooms qui vous accompagne pas à pas dans la découverte du shell.
- Un aide mémoire sur la programmation shell disponible aussi au format pdf
- Un guide avancé de la programmation du shell
- Vous pouvez aussi consulter la documentation disponible sur le site d’ubuntu
Le shell c’est quoi ?
Dans le contexte informatique et plus précisément pour les systèmes d’exploitation Unix et Linux, c’est un programme qui interpréte des commandes qui sont tapées au clavier par un utilisateur.
Au clavier !? Mais où voit-on la saisie ?
Dans un terminal ou une console…
Comme le montre la copie d’écran ci-dessus, dans la plupart des distributions Linux, on trouve un terminal, ou console dans le menu Accessoires, avec les bureaux gnome ou xfce, dans le menu Outils/Konsole, avec les bureaux KDE. Une fois que vous avez cliqué, sur Émulateur de terminal, ou Konsole, une fenêtre semblable à celle présentée dans la copie d’écran ci-dessous est ouverte.
Quelques commandes
Regardons de plus près les copies d’écran ci-dessus et ci-dessous. Sur la la première ligne de l’image 002_ter vous voyez écrit :
ecmpc@ecmadmin-dame:~$. Sur votre terminal vous devriez voir un curseur qui clignote à droite du caractère $. Il vous invite à écrire une première commande. Examinons tout d’abord chacun des termes que vous pouvez lire :
- ecmpc est le nom de l’utilisateur suivi du séparateur@
- ecmadmin-dame dans l’image 002_ter est le nom de la machine suivi du caractère : qui est un séparateur.
- Nous trouvons ensuite le signe ~ qui indique que le répertoire actif est celui de l’utilisateur.
- Enfin, le signe $ indique que le terminal a été lancé par un utilisateur, sinon la ligne se terminerait par un caractère #, comme vous pouvez le constater sur l’image 002_bis ci-dessous qui est un copie d’écran prise sur un ordinateur équipé d’une distribution Mageia et donc d’un bureau KDE. Vous noterez, dans ce cas là les modifications portant sur l’utilisateur qui est root, c’est à dire l’administrateur du système et la machine est désignée par localhost
Commandes « informatives »
La copie d’écran ci-dessous vous montre l’exemple de l’utilisation de 3 commandes : pwd,ls et ls-l. Ces trois commandes affichent une information, sans modifier quoi que ce soit au système. Pour exécuter une commande, il suffit d’écrire le nom de cette commande et la valider en appuyant sur la touche « Entrée ». La réponse est affichée dans le terminal lui-même. Pour effacer le contenu du terminal, il suffit d’utiliser le raccourci clavier Ctrl+L. La flèche directionnelle vers le haut permet de remonter l’historique des commandes précédemment utilisées.
- La commande pwd
Cette commande signifie Print Working Directory. Cette commande affiche le nom complet du répertoire de travail. Vous pouvez le constatez sur l’image 003. La ligne de réponse suit immédiatement l’appel à la commande et affiche /home/ecmpc, c’est à dire le chemin d’accès au répertoire personnel de l’utilisateur ecmpc. - La commande ls
La commande ls affiche les noms des fichiers et des répertoires contenus dans le répertoire de travail actif, dans l’image 003, il s’agit du répertoire de l’utilisateur ecmpc, nous l’avons vu. Si vous saisissez cette commande sur votre machine personnelle, vous devriez voir s’afficher la liste des répertoires (dossiers) et fichiers contenu dans votre répertoire personnel - La commande ls -l
La commande ls -l est un appel à la commande ls qui utilise l’option -l. Cette option modifie le mode d’affichage. Comme vous pouvez le constater, répertoires et fichiers sont affichés sous forme d’une liste et des information supplémentaires sont apportées.
InformationLorsque vous utilisez l’option d’une commande vous devez d’abord saisir le nom de la commande, ls, puis une espace, suivie d’un tiret -, lui-même suivi de la lettre symbolisant la commande ( dans notre cas l, comme « list » ) la lettre l accolée au tiret, sans espace.
- Analyse d’une ligne affichée par la commande ls -l
Soit la première ligne de l’image 003 :
drwxrwxr-x 3 ecmpc ecmpc 4096 avril 11 09:56 atelier_shell- drwxrwxr-x
De gauche à droite :
La lettre d indique que l’élément listé est un répertoire (directory) en anglais.
Le groupe de trois lettres rwx indique que le propriétaire de ce répertoire à le droit de lire -r comme read , d’écrire – write en anglais, d’exécuter – x comme eXecute .
Le groupe suivant de trois lettres rwx indique que le groupe de ce répertoire à le droit de lire – r comme read , d’écrire – write en anglais, d’exécuter – x comme eXecute .
Le groupe de trois lettres r-x indique que tous ceux qui ne sont pas le propriétaire du répertoire et qui n’appartiennent pas au groupe associé à ce répertoire ont le droit de lire – r comme read , n’ont pas le droit d’écrire – un tiret – à la place de w, d’exécuter – , mais ont le droit d’exécuter x comme eXecute .
InformationS’agissant d’un répertoire, cela signifie le droit d’ouvrir ce répertoire et de voir son contenu et de créer de nouveaux dossiers ou fichiers dans ce répertoire.
- Le nombre 3
Ce nombre indique le nombre de répertoires contenus dans le répertoire listé, y compris les deux répertoires . et .. ! - ecmpc
L’identifiant du propriétaire de l’élément listé. - ecmpc
L’identifiant du groupe associé à l’élément listé. - 4096
La taille en octets de l’élément listé.
InformationVous remarquerez que tous les éléments listés, sauf un, ont la même taille, 4096 octets, alors qu’ils « contiennent » un nombre différents de répertoire. Le verbe contenir est un abus ou une facilité de langage qui ne rend pas compte de l’organisation réelle du système de fichiers. En réalité chaque dossier « contient », non pas physiquement fichiers et répertoires, mais il contient des liens sur des dossiers et répertoires. Si bien que mon commentaire concernant le nombre 3 est abusif. Ce nombre désigne le nombre de liens physiques du répertoire. Un répertoire, même vide a toujours au moins deux liens physiques vers les dossiers . et ..!
L’élément qui a une taille de 13 octets est un fichier et non un répertoire. Vous pouvez le savoir en constatant que la ligne d’affichage le concernant ne commence pas par un d - avril 11 09:56
Ce groupe indique la date de création ou pour les fichiers de mise à jour de l’élément listé. L’année ne figure pas dans ce cas là, il s’agit de l’année courante. - atelier_shell
Il s’agit évidemment du nom du fichier listé.
InformationNotez que les noms de fichiers et des répertoires ne sont pas affichés de la même façon.
- drwxrwxr-x
- La commande factor
Juste pour le fun, une commande qui réjouira les mathématiciens et qui apporte vraiment une information indispensable. Tapez :
factor 214356684
Non, ce n’est pas mon patrimoine personnel en euros. Et la machine vous répondra :
2214356684: 2 2 3 61 292837
Ce qui correspond à la décomposition en facteurs premiers du nombre 2214356684 ! L’information importante est que vous savez maintenant que 292837 est un nombre premier !
- La commande cal
La commande cal permet d’afficher un calendrier. Sans option, elle affiche le calendrier du mois courant. Diverses options permettent d’obtenir le calendrier d’une année entière…
L’image 003.1 ci-dessous propose un florilège intéressant.
Commandes « modificatrices »
Le shell ne propose pas à l’utilisateur que des commandes informatives, on peut aussi utiliser des commandes qui modifient le système ou l’environnement de l’utilisateur. Nous allons en mettre en œuvre quelques unes. Mais avant de passer à quelques commandes modificatrices, examinons d’abord un commande qui ne modifie pas le système ou l’environnement mais qui modifie le répertoire de travail dans le terminal : la commande cd.
Je vous propose de procéder aux manipulations que vous pouvez voir dans la copie d’écran ci-dessus, image 005. Vous constaterez que j’ai, une fois de plus, changé de machine. Celle-ci porte un nom qui la localise « coin-du-bureau ». Le but de cette manipulation est de changer le répertoire de travail et de réutiliser une commande que nous venons de découvrir.
- Saisissez au clavier la commande cd Documentscomme sur la première ligne de l’image 005-1
InformationNotez que les noms de fichiers et des répertoires ne sont pas affichés de la même façon. En principe toutes les distributions Linux possèdent dans le répertoire de l’utilisateur un sous répertoire nommé Documents. Soyez attentif, lors de la saisie de cette commande :
- Le mot cd est séparé du mot Documents par une espace.
- Le mot Documents commence par un D majuscule et se termine par un s
- Saisissez la commande pwd, comme vous pouvez le voir dans la deuxième ligne de l’image 005-1. Constatez par vous-même que cette commande affiche le répertoire de travail /home/nom de l’utilisateur/Documents. Cela signifie que si nous utilisons des commandes qui modifient les répertoires et les fichiers, cette modification interviendra, en l’absence d’autres indications, dans le répertoire de travail Documents de l’utilisateur nom de l’utilisateur, en l’occurrence dans notre exemple pierre.
- Vous n’êtes pas obligé de procéder aux manipulations des 3 dernières lignes de l’image 005-2, elles ne sont là que pour rappeler la signification du signe ~.
En effet, lorsque l’on saisit la commande cd ~, le prompt est modifié et devrait ressembler à ceci :
nom de l’utilisateur@nom de la machine~$.
Le caractère ~ a permis de ramener le répertoire de travail au niveau du répertoire de l’utilisateur. Il était possible de saisir cd .., pour obtenir le même résultat. En effet les .., désigne le répertoire parent du répertoire actif. Le point seul, . , désigne le répertoire actif lui-même. Après avoir saisi à nouveau cd Documents, le prompt doit avoir cette forme :
nom de l’utilisateur@nom de la machine~/Documents$
Attention Dans les manipulations suivantes vous utiliserez des commandes qui permettent de créer de nouveaux répertoires et fichiers, de les effacer et de les copier ou les déplacer. Soyez très attentif au répertoire de travail actif et aux répertoires dans lesquels des modifications sont apportées.
- La commande mkdir
Sur la copie d’écran ci-dessous vous constatez que nous utilisons une nouvelle commande mkdir qui signifie Make Directory. Cette commande telle qu’elle est utilisée dans l’image 006 crée successivement trois nouveaux répertoires – source, cible, bidon – dans le répertoire de travail de l’utilisateur pierre. Le nom du nouveau répertoire est saisi, séparé par une espace après la commande.
Après la création de ces trois nouveaux répertoires, utilisez la commande ls, suivie de deux options, l’option l, déjà utilisée, et une nouvelle option, t, qui affiche la liste des fichiers et répertoires par ordre de date et heure de création. Vous pouvez ainsi constater que les trois répertoires ont été créés dans la même minute mais que bidon l’empotre d’une courte tête !
InformationLorsque vous utilisez l’option d’une commande vous devez d’abord saisir le nom de la commande, ls, puis une espace, suivie d’un tiret -, lui-même suivi de la lettre symbolisant la commande ( dans notre cas t, comme « time » ) la lettre t accolée au tiret, sans espace. De plus notez que lors de l’emploi de plusieurs commandes, celles-ci sont accolées et l’on n’utilise qu’un seul tiret.
- Redirection de commande et pipe
L’image 007-1, présente une nouvelle option de la commande ls, l’option R.
Cette option appliquée à la commande ls, va lister les dossiers, fichiers y compris les fichiers cachés, puisque l’option a est aussi invoquée. Si l’on utilise une machine installée depuis un certain temps, le nombre de lignes affichées peut être extrêmement important. Conséquence : on ne peut pas lire l’intégralité de l’affichage dans le terminal, même en utilisant la barre verticale de défilement.
Sur la copie d’écran ci-dessus, j’ai voulu m’assurer du nombre de lignes qui serait affiché. Pour cela la commande ls invoquée est suivie du caractère | qui est obtenu en appuyant sur AltGr + touche marquée 6.
Ce signe crée un pipe (tube) qui détourne le résultat de la commande ls de la sortie standard d’affichage et la transmet à une autre commande wc -l qui, avec l’option l utilisée, va compter chaque ligne fournie par la commande ls. Comme chaque ligne correspond à un fichier ou un répertoire, le nombre 34465 correspond au nombre de ces dossiers ou fichiers listés par la commande ls.
Connaître ce nombre n’a qu’un intérêt limité. Il faudrait pouvoir faire défiler la liste de ces répertoires et fichiers et savoir dans quel répertoire ils se trouvent. Pour cela, il faut utiliser un tube avec la commande less, comme vous le voyez dans l’image 007-1. Le contenu du terminal est effacé et la liste des fichiers est affichée. Seul le début de la liste est visible comme le montre l’image 007-2, ci-dessous. Vous avez alors accès aux touches de défilement vertical, qui permettent d’avancer ligne par ligne, au touche page vers le haut ou le bas, et le raccourci clavier Ctrl+Fin(de ligne) ou début, vous permet d’accéder directement à la fin ou au début de l’affichage de la liste entière.
On quitte cet affichage en appuyant sur la touche Q et l’on retrouve le contenu du terminal comme vous pouvez le constater ci-dessous dans l’image 007.3.
De retour de la commande ls -alR | less tapez, comme le montre la copie d’écran ci-dessus, la commande ls -alR > ./source/texte.txt, ligne 4 de l’image 007.3. Cette commande ressemble, par sa structure, à la précédente si ce n’est que le caractère | est remplacé par >. Le principe de fonctionnement est le même. La sortie de la commande ls n’est pas affichée dans le terminal, rien n’est affiché mais le flux de sortie de la commande est enregistré dans un fichier nommé texte.txt qui sera placé dans le répertoire source. Notez l’usage du ./. Le point indique que le répertoire source est dans le répertoire de travail courant. Le caractère > permet d’opérer une redirection de la sortie de la commande ls vers un fichier. Après exécution de cette commande, vous pouvez, comme le montre l’image 007.3, enchaîner les commandes
cd source
ls -lpour constater que le fichier texte.txt est bien présent dans le répertoire source. Constatez l’affichage de ls, la taille de ce fichier sur mon ordinateur est de 2208387 octets, soit plus de 2 Mo. D’où l’intérêt des pipes et de la redirection. Pour des raisons de visibilité de l’affichage les dernières lignes de l’image 007.3, sont reproduites dans l’image 007.4, ci-dessous.
L’image 007.4, montre que le répertoire actif est ~/source. Réutilisez la commande précédente, ls -alR > autre_texte.txt en nommant, cette fois, le fichier autre_texte.txt. L’enregistrement se fera dans le répertoire de travail source. Saisissez à nouveau la commande ls -l. Constatez la différence de taille entre le deux fichiers autre_texte.txt 249 octets, comparée au 2 Mo de texte.txt, différence que vous n’aurez pas de peine à expliquer.
- La commande cp
La commande cp permet de copier répertoires et fichiers et de les coller (copypaste) dans un autre répertoire. L’image 010 montre que l’on invoque les commandes suivantes :
- cd .. qui permet d’accéder au répertoire parent du répertoire de travail.
- ls -l ./source qui affiche le contenu du répertoire source. Ceci permet de vérifier que ce répertoire contient bien les deux fichiers que nous avons créés précédemment,autre_texte.txt et texte.txt.
On invoque ensuite la commande cp :
cp ./source/texte.txt ./cible
.
Cette commande est invoquée avec deux arguments, le premier, ./source/texte.txt, séparé de cp par une espace représente la source de la copie, ici le fichier texte.txt dans le répertoire source, le deuxième ./cible, séparé du premier par une espace, ./ciblereprésente le répertoire cible dans lequel sera copié le fichier texte.txt. Comme le nom du fichier n’a pas été précisé, le fichier copié portera le même nom.ls -l ./cible
permet de vérifier qu’il y a bien maintenant dans le répertoire cible un fichier nommé texte.txt
Enfin, la commande cp est invoquée une dernière fois, image 011, avec le même premier argument et un deuxième argument différent
cp ./source/texte.txt ./cible/texte_autre.txt
Cette fois on précise dans le deuxiéme argument un nouveau nom pour le fichier cible, texte_autre.txt.
Puis on utilise la commande ls pour vérifier que les deux répertoires source et cible contiennent bien ce que l’on attend :
ls ./source
qui affiche autre_texte.txt et texte.txt les deux fichiers d’origine.
ls ./cible
qui affiche texte_autre.txt et texte.txt qui sont les deux fichiers copiés dans le répertoire cible.
En conclusion, la commande cp conserve le fichier d’origine. Si on le copie dans un autre répertoire, ce fichier peut-être renommé. Si on le copie dans le même répertoire ce fichier doit être renommé. Si on tente de copier un fichier sur lui-même comme dans l’image 011.1, le logiciel vous rappelle la logique la plus élémentaire.
- La commande mv
Cette commande mv, au lieu de copier, déplace c’est à dire que le fichier source est supprimé. Son utilisation est illustrée par l’image 012. Dans un premier temps on utilise la commande dir qui est l’équivalent de la commande ls
dir ./cible
qui permet de vérifier le contenu du répertoire cible.
dir ./source
qui permet de vérifier le contenu du répertoire source.
Tout va bien.Puis l’on invoque, image 012, la commande mv avec deux arguments séparés par une espace, le premier pour la source, le deuxième pour la cible.
mv ./source/autre_texte.txt ./cible/mon-autre-texte.txt
puis
ls ./souce
pour vérifier le contenu du répertoire source.
ls ./cible
pour vérifier le contenu du répertoire cible.
Tout va bien. La source ne contient plus qu’un seul fichier, texte.txt. Le répertoire cible en contient trois – texte.txt et texte_autre.txt copiés par la commande cp et mon-autre-texte.txt déplacé par la commande mv à partir du fichier autre_texte.txt, placé initialement dans le répertoire source. - La commande rmdir
La commande rmdir, pour remove directory, permet d’effacer un répertoire. Mais elle renverra un message d’erreur si le répertoire n’est pas vide. Ce qui peut paraître une sage précaution.
Vous pouvez constatez cela en examinant l’image 013 ci-dessus. Une première commande est invoquée :
ls -t
Comme nous l’avons déjà vu l’option t trie la sortie de la commande ls par ordre chronologique de l’élément créé du plus récent au plus ancien. Vous voyez les trois répertoires créés récemment avec la commande mkdir, d’abord cible, le plus jeune, puis source et enfin bidon le plus vieux !
rmdir source
Réponse :
rmdir : échec de suppression de «source»: le dossier n’est pas vide.
puis
rmdir cible
Même échec.
rmdir bidon
Pas de message d’échec. Donc suppression réussie, confimée par l’affichage de la commande :
ls -t
Le répertoire bidon n’est plus listé. CQFD
Les commandes de l’interactivité
-
La commande echo permet d’afficher du «contenu» dans le terminal. Quel contenu ? Le plus intéressant est qu’elle permet d’afficher le «contenu» d’une variable. Mais qu’est-ce qu’une variable ?
- Notion de variable :
La variable est un concept important en programmation informatique. Intuitivement, il s’agit d’un nom qui se réfère à une chose. Informatiquement, c’est une référence à une adresse mémoire.
Il s’agit d’une entité créée dans l’ordinateur à laquelle on donne un nom et qu’on utilise en invoquant ce nom dans le code source du programme, capable de contenir des informations dont la valeur peut varier au cours du temps selon les manipulations que le programme lui fait subir. (In WikiBook ).- Types de variable :
Pour faire court nous pouvons dire que le shell permet de travailler avec trois types de variables
Les variables définies par l'utilisateur
Les variables prédéfinies par le système
Les variables spéciales
Dans la cadre de cette courte présentation qui se veut surtout pratique, nous parlerons d’abord brièvement des variables prédéfinies par le systèmes, appelées souvent variables d’environnement.- Les variables d’environnement :
Nous ne passerons pas en vue toutes les variables d’environnement. Notre objectif est d’illustrer l’affichage du contenu d’une variable en utilisant par ordre d’entrée en scène, les variables :PWD
qui contient toujours le nom du répertoire courant. USER
qui contient le nom de l’utilisateur connecté. SHELL
contient le nom du shell actif. TERM
contient le nom du type de terminal utilisé. LANG
contient les références de l’encodage linguistique par défaut du système. HOSTNAME
évidemment le nom de la machine. Ces mots son les noms, tous écrits en lettres majuscules, des variables.
Pour une information plus complète sur les variables d’environnement, consultez le site du zéro.L’image 017 ci-dessous, vous montre tout d’abord une utilisation de la commande pwd et de la commande echo. En première ligne on invoque d’abord la commande
pwd
.
Réponse :/home/pierre
Puis on saisit la commande
echo $PWD
Réponse
/home/pierre
InformationNotez la commande
echo
est suivi du nom de la variablePWD
précédé du caractère $. Ce caractère indique qu’il s’agit d’une variable, ce n’est plus la commande pwd écrite en miniscule.echo $PWD
affiche le contenu de la variable$PWD
:
/home/pierre
Les commandes suivantes saisies dans le terminal de l’image 017 ci-dessus, sont très intéressantes. En effet, on change le répertoire courant avec la commande :
cd Documents
puis
pwd
suivi de la réponse
/home/pierre/Documents
Mais ce qu’il faut observer et comprendre c’est l’invocation de la commande
echo $PWD
InformationLe contenu de la variable
$PWD
a changé. Il n’est plus/home/pierre
, mais/home/pierre/Documents
. Ces manipulations ont permis de mettre en évidence ce qu’est une variable, elle pointe vers un contenu dont la valeur peut-être modifié. Ce qui a modifié le contenu de$PWD
, c’est l’interprétation de la commandecd Documents
qui a affecté à la variable$PWD
une nouvelle valeur. On parle de l’affectation d’une variable.L’image 014 parle d’elle-même. On invoque la commande
echo "Bonjour, Vous êtes l'utilisateur $USER"
On trouve entre guillemet le texte à afficher ET
$USER
. Mais ce n’est pas le texte «$USER» qui est affiché mais la valeur contenu par la variable, c’est à dire l’ditenfiant de l’utilisateur connecté.L’image 015 montre le même usage de la commande echo déjà commenté à la suite de l’image 014. On invoque la commande
echo -e "Bonjour,\n Vous êtes l'utilisateur $USER"
comme dans l’image précédente à deux petits détails près :
Utilisation de l’option -e qui permet reconnaître les caractères spéciaux
Utilisation du caractère spécial \n qui contraint l’affichage à un saut de ligne avec retour en début de ligne comme vous le voyez sur l’image 015
Tout a été dit. Je vous laisse le soin d’analyser par vous-même les commandes et l’affichage de l’image 016.
- La commande read
La commande read est une commande qui permet à l’utilisateur de saisir au clavier un texte. Cette commande est évidemment souvent associée à la commande echo qui affiche un texte ou le contenu d’une variable à l’écran. L’image 018 montre une utilisation minimale de la commande read
Premier temps saisie de la commande :
read nom
Le mot nom est l’identifiant d’une variable. Deuxième ligne, le curseur clignote, l’utilisateur saisit son nom Pierre.
Deuxième temps saisie de la commande :echo $nom
qui déclenche l’affichage du contenu de la variable $nom.
InformationPour résumer dans un premier temps la commande
read nom
correspond à une affectation de la variable nom qui n’est pas précédée du caractère $. L’affichage est celui du contenu de la variable $nom.
- Affectation d’une variable
Pour mieux percevoir ce problème de l’affectation d’une variable saisissez dans un terminal ceci :
nom=Pierre
echo $nom
Après la dernière commande vous devriez voir s’afficher le mot Pierre comme le montre l’image 018.1 ci-dessous.
AttentionSoyez attentif à la différence entre, d’une part la commande
read nom
que nous avons vu précédemment qui invitait l’utilisateur à enregistrer au clavier un mot qui serait affecté à la variable nom et, d’autre part, la commande
nom=Pierre
qui correspond à une affectation de la variable nom qui n’est pas précédée du caractère $. Cette affectation ne se fait pas de manière interactive, mais par programme. Le signe =, n’est pas un signe d’égalité, mais un opérateur d’affectation. Veillez à ne placer aucune espace entre le nom de la variable nom et le signe =, d’une part, et le signe =, et le mot Pierre, d’autre part.
La ligne suivante…
echo $nom
permet,comme nous l’avons déjà vu précédemment, l’affichage du contenu de la variable $nom. le mot nom est, cette fois, précédé du signe $.
L’image 019ci-dessous montre une manière plus claire, pour l’utilisateur, de comprendre ce que l’on attend de lui. En effet au lieu d’écrire simplement comme nous l’avions fait précédemment…
read nom
…la première ligne se présente ainsi
read -p "Quel est ton nom ?" nom
Nous validons et le shell affiche la question…
Quel est ton nom ?
Le curseur clignote après le point d’interrogation de la ligne Quel est ton nom ?. L’utilisateur entre son nom Alain. C’est la valeur que va prendre la variable nom. Notez l’option -p qui suit la commande read. Cette option signifie print, elle indique que la phrase qui suit, placée entre guillemets (« Quel est ton nom ? » doit-être affichée dans le terminal. Les guillemets délimitent donc ce que l’on appelle une chaîne de caractères. Nous attirons enfin votre attention sur le fait que chacun des éléments de la ligne de commande est séparé des autres par une espace.
Enfin nous affichons le résultat saisit par l’utilisateur avec la ligne de commande…
echo -e "Bonjour $nom\nBienvenue sur la machine $HOSTNAME"
Cette ligne de commandes comprend trois éléments :
- La commande echo que nous avons déjà utilisée. Elle affiche le contenu de la chaîne de caractères placée entre guillemets.
- L’option -e qui active l’interprétation du slash inversé (\). En clair cela signifie que le slash inversé ne doit pas être affiché comme un caractère, mais que le shell doit interpréter le caractère qui suit l’anti-slash comme un caractère spécial. Le caractère spécial n indique ici un retour à la ligne avec saut de ligne.
- Enfin, troisième éléments, la chaîne de caractères. Elle est placée entre guillemets et le fait nouveau est qu’elle contient le caractère spécial \n que nous venons de signaler et deux varabiables : $nom et $HOSTNAME. Vous remarquerez, évidemment que la commande echo, n’affiche pas les mots $nom et $HOSTNAME mais le contenu de ces deux variables, c’est à dire Alain et le nom de la machine au-coin-du-bureau comme vous pouvez le constater sur l’image 019.
Depuis que nous parlons de commandes dites interactives, certains d’entre vous doivent se dire, in petto, c’est idiot ce truc, à quoi ça peut bien servir que je me demande mon propre nom ! C’est que jusqu’alors vous portiez deux casquettes, celle du programmeur et de l’utilisateur du programme. Imaginez maintenant que vous soyez devant un ordinateur et que l’on vous demande d’écrire dans un terminal, comme vous le voyez sur l’image 020 ./dial.sh et de valider.
Comme vous pouvez le constater sur l’image 020, ci-dessus, cette fois vous n’avez pas écrit une ligne de commandes et pourtant la question posée et l’affichage sont les mêmes que dans l’exercice précédent. Tout simplement en écrivant ./dial.sh vous avez invoqué un programme qui est un script qui contient les lignes de commande que nous avons précédemment. Et cette fois vous n’es que l’utilisateur. Ce serait intéressant de devenir le programmeur d’un script, fut-il très modeste. C’est ce que nous allons essayer.
Écriture d’un premier script
- Utilisation d’un éditeur :Nous allons utiliser l’éditeur gedit pour écrire ce premier script. Dans la plupart des distributions Linux, vous trouverez cet éditeur dans la rubrique Accessoires du Menu. Vous écrirez les lignes suivantes :
#! /bin/bash
read -p "Quel est votre nom ?" nom
echo -e "Bonjour $nom.\nBienvenue sur la machine $HOSTNAME.\n"
echo "Fin du programme."
comme le montre l’image 021 ci-dessous
- Enregistrement du fichier :Vous devrez enregistrer ce fichier dans le dossier source que nous avons créé précédemment. Pour cela cliquez sur le menu Fichier/Enregistrer ou sur le bouton Enregistrer et nommez votre fichier dial.sh. Votre fenêtre geditdevrait alors ressembler à ce que vous voyez sur l’image 022.
Les lignes ont été colorisées, ce qui permet de mieux distinguer les différents éléments. Deux lignes sont nouvelles. La première est
#! /bin/bash
Elle commence par un #. Ce caractère sert à créer des commentaires dans un programme. Tout ce qui est après le # ne fait pas partie du programme mais est un commentaire qui peut aider le programmeur ou d’autres programmeurs à se rappeler ou comprendre ce que fait une ou plusieurs lignes du programme. Un script shell commence toujours par cette première ligne qui indique au système quel est le type de shell utilisé. Ici nous employons le bash.La deuxième ligne nouvelle est la dernière ligne.
echo "Fin du programme."
Elle permettra d’afficher le message Fin du progamme.
- Rendre le fichier exécutable :Vous avez donc créé un script appelé dial.sh. Mais tel qu’il est ce script placé dans le répertoire source n’est pas exécutable. Pourquoi ? Parce que les droits encore appelés permissions sur ce fichier ne le permettent pas. Pour une présentation plus précise des droits sur les fichiers vous devriez consulter ce forum d’Ubuntu ou revoir la première analyse que nous avions faite de la commande ls -l.Revenons tout de même sur la commande ls -l. Placez-vous dans le répertoire source qui contient votre fichier dial.sh. Pour ré-information vous devriez voir dans votre terminal, quelque chose qui ressemble à ce que vous voyez dans l’image 023 ci-dessous.
RéinformationNous avions déjà analysé une ligne semblable, voir ce paragraphe. Nous revenons simplement sur le premier groupe d’informations.
-rw-r--r--
Ce bloc comprend 9 caractères :
- Le premier indique le type de l’objet listé. Dans notre cas il s’agit d’un tiret -. Ceci nous indique que l’objet est un fichier. Si nous avion vu un d, nous aurions eu affaire à un répertoire et un l nous aurait indiqué un lien. Nous trouvons ensuite 3 groupes de 3 caractères.
- Le premier groupe rw- représente les droits du propriétaire du fichier ici pierre. La lettre r signifie que le propriétaire du fichier a le droit de lire le fichier. La lettre w indique que le propriétaire a le droit d’écrire dans le fichier. En clair, le propriétaire du fichier a le droit de modifier le fichier. Enfin, le dernier caractère est un tiret, -. Ce dernier caractère fixe les droits d’exécution du fichier. Le - indique que le propriétaire du fichier n’est pas autorisé à exécuter le fichier.
- Le deuxième et le troisième groupe de caractères se présentent ainsi :
r--r--
Ces deux groupes de caractères représentent respectivement les droits du groupe propriétaire du fichier, ici le groupe pierre et les droits de tous les autres utilisateurs qui ne sont ni pierre ni inclus dans le groupe pierre. Vous l’aurez compris ce fichier n’est pas exécutable car chacun des troisièmes caractères est un tiret -.
Donc pour rendre ce fichier exécutable, vous l’aurez compris, il suffit que le troisième caractère de chaque groupe de caractères définissant les droits d’exécution du propriétaire, du groupe et de tous les autres utilisateurs soit autre chose qu’un tiret. Dans votre terminal tapez donc la ligne de commande suivante :
chmod 755 ./dial.sh
Puis invoquez à nouveau la commande ls -l
. La réponse à cette commande devrait ressembler à l’image 024 ci-dessous.Cette fois vous pouvez constater chacun des troisièmes caractères dont nous parlions ne sont plus des -, mais des x comme exécutable. Il ne reste plus qu’à vérifier que le script fonctionne bien.
- Lancer l’exécution du script :Pour lancer l’exécution du script vous pouvez , soit le faire à partir d’un terminal, soit à partir d’un gestionnaire de fichier double-cliquer sur le nom du fichier ou encore, sélectionner le fichier du script, cliquer sur le bouton droit de la souris,sélectionner Ouvrir puis cliquer sur le bouton Lancer. L’image 025 ci-dessous vous montre le processus de lancement du script dans un terminal.
RéinformationVous remarquerez dans l’image 025 ci-dessus que l’exécution du script dial.sh ne se fait pas simplement en écrivant :
dial.sh
mais
./dial.sh
N’oubliez pas de faire précéder le nom du script de ./ sinon vous recevrez comme réponse
dial.sh : commande introuvable
comme le montre l’image 026 ci-dessous.Pourquoi le script fonctionne-t-il lorsque j’écris ./dial.sh et ne fonctionne-t-il pas lorsque j’écris dial.sh ? Lorsque je place les caractères ./ avant le nom du fichier, ces deux caractères sont interprétés comme un chemin où le système doit trouver le fichier exécutable dial.sh. Le point . signifie pour le shell, le répertoire courant, c’est à dire le répertoire nommé source, dans lequel /, il faut chercher. Comme le montre les images 027, 028,029, je peux indiquer de manières différentes le chemin pourvu qu’il conduise au bon fichier, ce dernier sera interprété.
Une certitude ces différents appels au script dial.sh fonctionnent. Le script est exécuté. Donc si cela fonctionne, c’est que les différents notations de chemin proposées sont justes. À vous de trouver pourquoi. En revanche si le fichier n’existe pas comme dans l’image 030 ou n’est pas exécutable, vous courez à l’échec comme le montre la copie d’écran 031.
Vous devriez aussi deviner pourquoi le script n’est pas interprété par le shell lorsque j’écris dial.sh et pourquoi il se passe quelque chose lorsque j’écris ls -l. Simple ? Non ? Dans le deuxième cas j’utilise une commande shell connue et le shell est programmé pour chercher à certains endroits précis ces commandes et les interpréter. Mais dial.sh ne correspond à aucune commande du shell. Il faut donc lui indiquer le chemin d’un script exécutable.
La documentation
À RÉDIGER
Conclusion
Cet article, comme je l’avais écrit en préambule, n’est évidemment pas un cours sur le shell. Il s’adresse essentiellement aux personnes qui organiseraient, comme l’a fait l’ULLM, des ateliers sur le shell. Les participants à ces ateliers ignoraient, pour la plupart, l’existence d’un terminal et la possibilité d’utiliser des commandes pour exécuter un certain nombre de tâches. Cet article est donc conçu comme une invitation à faire des premières gammes, des travaux pratiques comme nous avons tenté de le faire dans le cadre de nos ateliers du jeudi.
La suite logique de ce document est d’aborder l’écriture de scripts shell. C’est ce que propose le document intitulé Atelier shell : création de scripts. Le sujet est déjà amorcé dans le présent article lorsquil est question des commandes echo et read. L’emploi de la commande echo, entraîne la découverte de la notion de variable. Et le lien d’interactivité entre les deux commandes, echo et read conduit nécessairement à la prise de conscience qu’il faut effacer l’écriture dans un terminal rendue absurde par le fait que c’est la même personne qui écrit l’une et l’autre commande, c’est à dire qui se demande à elle-même son propre nom. L’usage de ces commandes n’a de sens que dans un programme qui interroge toute personne qui l’active ce que nous montrons par la dernière copie d’écran 020 qui est l’affichage produit par le programme dial.sh. L’écriture des commandes dans le terminal a disparu. Et nous avons montrer comment écrire un premier script très simple dial.sh qui n’est que la retranscription de ce que nous avions écrit précédemment dans un terminal.