MO201 Cours 2 Introduction à UNIX - ensta

La page est créée Jean Chevallier
 
CONTINUER À LIRE
MO201 Cours 2 Introduction à UNIX - ensta
MO201
                                                        Introduction à UNIX
                                                              Cours 2
                                                                      Alexandre Chapoutot, U2IS
                                                                          François FERLAND
                                                                              2017-2018

Bonjour, et bienvenue dans ce deuxième cours de MO101.

Hier, nous avons abordé des concepts de base concernant l’arborescence de fichiers, l’éditeur de texte gedit, et quelques commandes de bases au terminal…
Contenu
                                             •   Information sur les imprimantes à l’ENSTA

                                             •   Composition des fichiers

                                             •   Construction de commandes

                                             •   Écriture et lecture de fichiers

                                             •   Redirection

Aujourd’hui, nous verrons:
Pour commencer, un léger supplément d’information sur l’impression à l’ENSTA;
Un peu plus de détails sur la composition des fichiers;
La construction de commandes avancées;
L’écriture et lecture simples de fichiers, donc de la modification de contenu;
Et le concept de redirection de sortie de commandes, un concept puissant sous UNIX.
Imprimantes
                                              •   Cinq imprimantes dédiées, réparties dans l'école,
                                                  permettent aux étudiants de sortir leurs
                                                  impressions avec leurs badges.

                                                  •   Trois près des salles de cours (dont une couleur
                                                      au premier étage)

                                                  •   Une au Centre de Documentation Multimédia
                                                      (CDM)

                                                  •   Une en salle des élèves

Donc, tout d’abord nous avons un petit supplément sur les services d’impression à l’ENSTA.
Il y a 5 imprimantes dédiées aux étudiants un peu partout dans l’école, et les travaux imprimés doivent être récupérés à l’aide de votre badge.
Il y en a trois près des salles de cours où nous seront après cette séance, une au Centre de Documentation Multimédia (appelé aussi CDM, ou bibliothèque), et une en
salle des élèves accessible en tout temps. Je vous invite à consulter le DSI si vous avez des questions particulières à ce sujet.
Composition des fichiers
                                                 •   Fichiers texte

                                                     •   Lisible directement depuis le terminal

                                                     •   Nécessite un encodage particulier

                                                 •   Fichiers binaires

                                                     •   Difficile à visualiser sans transformation (texte ou
                                                         graphique)

Premièrement, revenons à la classification de base des fichiers sous UNIX que j’ai brièvement présentée hier: les fichiers texte et les fichiers binaires.

Le grand avantage des fichiers texte est qu’ils sont humainement lisibles, particulièrement depuis le terminal. En effet, le terminal est conçu pour afficher directement ce
genre de contenu.
Par contre, il y a plusieurs façon d’encoder ce texte, particulièrement pour les accents et autres caractères qui dépassent l’alphabet latin de base, ce que nous allons voir
un peu plus tard.
Les fichiers binaires, à l’inverse, nécessite absolument une application additionnelle pour interpréter leur contenu.
Par exemple, il est tout à fait possible de regarder le contenu binaire brut d’un fichier image au terminal, mais cela ne nous donnera pas des images en couleur.
Fichier binaire
                                                                   Exemple d’un document PDF

Par exemple, voici un extrait tiré au hasard de la version PDF de la présentation d’hier.
Le terminal tente bien d’interpréter les octets comme du texte, mais rien n’est reconnaissable.
En fait, on reconnaît certaines lettres dans le contenu, mais si l’octet ne représente pas un caractère connu, il est affiché sous forme hexadécimale. L’interprétation varie
de terminal en terminal, on voici un exemple sous Mac OS X, mais le résultat demeure le même: quelque chose de très difficile à interpréter.
Encodage texte

                                               •   Permet d’associer un caractère à une valeur
                                                   numérique

                                               •   Plusieurs types: ASCII, ISO 8859-1, UTF-8, …

Voyons maintenant comment le terminal ou tout autre logiciel qui manipule du texte reconnaît un octet comme un caractère: l’encodage de texte.

Le but de l’encodage est d’associer une valeur numérique à un caractère connu. Il existe plusieurs normes qui ont évolué avec l’informatique. L’ASCII est une des plus
anciennes, et aujourd’hui on utilise beaucoup l’UTF-8, qui se veut universel peu importe l’alphabet utilisé.
ASCII

                                               •   Inventé en 1960, conçu pour la télé-impression

                                               •   Chaque caractère est enregistré sur 7 bits (0-127)

                                               •   Inclut des codes de contrôle pour terminaux

                                               •   N’inclus que l’alphabet latin, et sans accents

Mais voyons tout d’abord l’ASCII, qui a été inventé dans les années 1960 un peu avant UNIX, et qui a été conçu pour le teletype, la première interface utilisateur UNIX.
Sous cette norme, chaque caractère est encodé par 7 bits, soit une valeur de 0 à 127.
Or, ils sont la plupart du temps stockés sur des octets, et le huitième bit est ignoré.
En plus des lettres, nombres et ponctuation de base, la norme inclut des codes de contrôle pour les terminaux, par exemple pour signaler un changement de ligne.
Finalement, la norme ne contient que l’alphabet latin de base, et donc ni accent, ni autres symboles.
Notation octale
                                               •   Valeurs de 0 à 7 sur 3 bits

                                                   •   Idéal pour mots de 3 bits

                                               •   Notation ASCII: 1 + 3 + 3 (7 bits)

                                                   •   De 0 à 127 en décimal

                                                   •   De 000 à 177 en octal (175, 176, 177, 200,
                                                       201…)

Pour noter les valeurs numériques en ASCII, on peut utiliser la notation octale, ou à base 8.
Les chiffres utilisés ne vont que de 0 à 7, et représente donc une valeur sur 3 bits.
C’est donc idéal pour des systèmes qui font intervenir des mots de multiples de 3 bits, comme l’ASCII, qui encode sur 1 + 3 + 3 pour un total de 7 bits.
Ainsi, les valeurs 0 à 127 s’écrivent plutôt 0 à 1.7.7
Aussi, en ASCII, le chiffre le plus significatif ne sera jamais plus de 1, vu que 128 vaut 200 en octal, et nécessiterait un huitième bit.
Voici la table complète des symboles ASCII. Il est évidemment inutile de l’apprendre par coeur. Or, on peut voir comment certaines séquences de caractères coincident
avec des valeurs pratiques en octal. Par exemple, les codes de contrôle, au nombre de 32, vont de 000 à 040. Le caractère représentant le 0 commence à 060, et ainsi
de suite. Même chose pour les lettres: le A majuscule est à 101, et le A minuscule à 141. Numériquement, cela veut dire que pour passer d’une majuscule à une
minuscule, il suffit d’ajouter 040 en octal.
UTF-8 (Unicode)
                                               •   L’ASCII est encodé sur 7 bits, mais stocké sur des octets (8 bits,
                                                   0-255)

                                               •   L’UTF-8 se sert du bit additionnel pour différentier un caractère
                                                   ASCII traditionnel et un caractère étendu

                                                   •   0-127: ASCII

                                                   •   128-255: Points de contrôle et caractères additionnels

                                               •   Un point de contrôle indique que le(s) prochain(s) octet(s) est un
                                                   caractère étendu

                                                   •   Plus d’un million de caractères disponible, incluant plusieurs
                                                       alphabets et émoticônes (emoji)

Or, comment faisons-nous pour encoder tous les caractères non-latins de base ? J’ai dit plus tôt que l’ASCII, malgré qu’il soit défini sur 7 bits, est à peu près toujours
stocké sur un octet de 8 bits, ce qui nous donne 128 valeurs numériques additionnelles, soit de 0 à 255.
Traditionnellement, les autres systèmes d’encodage comme l’ISO 8859-1 encode des caractères additionnelles, comme les accents, dans ces 128 nouvelles valeurs. Or,
ce n’est pas suffisant pour des alphabets autre que le latin, et l’emplacement des accents avait tendance à varier d’un système d’exploitation à l’autre.
C’est pourquoi la norme Unicode, et sa variante la plus populaire l’UTF-8, a été créée. Plutôt que de tenter de tout encoder dans 255 valeurs, l’UTF-8 demeure identique
à l’ASCII pour les 127 premières valeurs, mais utilise les 128 autres comme points de contrôle. Ces points de contrôle indiquent que le ou les prochains octets, soit au
moins les 8 bits suivants, appartiennent à une plage de caractères différents. Cela indique donc au Terminal de combiner plusieurs octets en un seul caractère, ce qui
permet aujourd’hui d’afficher des millions de caractères différents, en plus d’icônes comme les emojis.
Fichiers exécutables
                                                •   Trait appliqué par droits d’accès (plus de détails au
                                                    troisième cours)

                                                •   Autant applicable aux fichiers textes que binaires

                                                    •   Texte: Script nécessitant un interpréteur (ex.
                                                        bash)

                                                    •   Binaire: Chargé en mémoire, sont des
                                                        instructions machine

Avant d’aller plus loin, nous allons couvrir une catégorisation additionnelle des fichiers sous UNIX: Les fichiers exécutables.
Sous UNIX, un fichier exécutable est tout simplement un programme ou une application. D’ailleurs, pratiquement toutes les commandes montrées dans le cadre de ce
cours ont un fichier exécutable associé. Un fichier exécutable est aussi n’importe quel fichier qui a été marqué ainsi par ses droits d’accès, que nous allons voir plus en
détails au prochain cours.
C’est une dimension orthogonale à celle des fichiers binaires et texte, car un exécutable peut être les deux.
Or, leur contenu est interprété bien différemment selon le cas: Un fichier texte nécessite un interpréteur, c’est à dire un autre programme qui exécute ligne par ligne le
contenu, comme si vous aviez tapé vous-mêmes le contenu à la ligne de commande. On en retrouve en bash, soit le même environnement que celui par défaut à la ligne
de commande, mais aussi dans d’autres languages, comme Python, qui est à l’étude en IN101.
Si c’est un fichier binaire, il est chargé en mémoire, et son contenu est interprété directement par le processeur: ce sont des instructions machines, et ne sont
généralement pas éditée à la main. On utilise plutôt un compilateur, qui transforme des fichiers textes en instructions machines, ce qui est couvert en IN102 avec le
langage C.
Construction de
                                                             commandes

                                                      mkdir -p dossier/sous-dossier

Maintenant, retournons à la ligne de commande, avec quelques notions de constructions de commandes.
Vous avez déjà utilisé la ligne de commandes hier avec quelques instructions simples, mais nous verrons aujourd’hui comment assembler des commandes plus
complexes. Prenons par exemple celle-ci, qui permet de créer un dossier et un sous-dossier en même temps.
Construction de
                                                                 commandes
                                                         mkdir -p dossier/sous-dossier

                                                      Exécutable                  Arguments

Tout d’abord, les différents éléments d’une commande sont divisés par des espaces, à moins d’utiliser la barre oblique inverse ou les guillemets comme nous l’avons vu
hier.
Le premier élément est toujours la partie exécutable, soit le programme que l’on souhaite invoquer. Ensuite, tous les autres éléments sont appelés les arguments, et les
retrouve ici au nombre de deux: -p et dossier/sous_dossier
Construction de
                                                                 commandes
                                                          mkdir -p dossier/sous-dossier

                                                      Exécutable                   Arguments

                                                                Option(s)

Le premier élément, -p, est plutôt considéré comme une option. Plutôt qu’indiquer à mkdir sur quoi il doit opérer, une option indique plutôt comment il doit opérer.
Par exemple, l’option -p ici indique à mkdir que si le dossier "dossier" n’existe pas, il doit le créer avec d’en faire de même avec sous-dossier.
Si l’option -p n’était pas là, et que le dossier dossier n’existait pas, on aurait une erreur.
Sélection de fichiers

                                             •   Symbole *: Aucun ou plusieurs caractères

                                             •   Caractère ?: Un et un seul caractère

Hier, nous avons vu brièvement comment des commandes comme touch ou rm peuvent opérer sur plusieurs éléments en une seule commande. Or, il n’est pas toujours
nécessaire de spécifier chacun des éléments sur lesquels ont veut opérer. Des caractères spéciaux, comme l’* et le ?, nous permettent de faire ce qu’on appelle la
sélection de fichiers.
Ainsi, le caractère * permet d’être substitué par 0 ou plusieurs caractères, n’importe lesquels, alors que le ? peut remplacer un et un seul caractère.
Exemples
                                             •   ABC

                                             •   Test

                                             •   Test1

                                             •   Test2

                                             •   Test30

Ces notions seront beaucoup plus simples à comprendre avec un exemple. Prenons par exemple cette liste de fichiers, et disons que je voudrais supprimer un ou
plusieurs de ces fichiers selon certains critères.
Exemples
                                                 •   ABC

                                                 •   Test

                                                 •   Test1                                            rm *
                                                 •   Test2

                                                 •   Test30

Dans le premier cas, je veux supprimer tous ces fichiers: je peux utiliser l’étoile seule, qui indique essentiellement que tous les fichiers accessibles dans le dossier en
cours seront affectés.
Exemples
                                                •   ABC

                                                •   Test

                                                •   Test1                                         rm A*
                                                •   Test2

                                                •   Test30

Si on veut être plus précis, on peut combiner l’étoile avec d’autres caractères. Ici, j’indique à rm que je souhaite supprimer tous les noms de fichiers commençant par la
lettre "A". Dans notre cas, il n’y a que ABC.
Exemples
                                                 •   ABC

                                                 •   Test

                                                 •   Test1                                     rm Test*
                                                 •   Test2

                                                 •   Test30

Si j’utilise plutôt "Test*" c’est tous les autres fichiers qui seront supprimés. Remarquez que nous ne somme pas limités à n’utiliser qu’une seule lettre avant l’étoile.
Exemples
                                                •   ABC

                                                •   Test

                                                •   Test1                                     rm Test?
                                                •   Test2

                                                •   Test30

Regardons maintenant comment utiliser le ?. Ici, j’indique vouloir supprimer tous les fichiers commençant par "Test" et suivi d’un et un seul caractère. Ainsi, les fichiers
Test et Test30 sont épargnés.
Exemples
                                                •   ABC

                                                •   Test

                                                •   Test1                                   rm ?est?*
                                                •   Test2

                                                •   Test30

Les caractères ? ne sont obligés d’être utilisés en fin d’expression, et peuvent également être combinés. Ici, je souhaite que les caractères 2 à 4 des fichiers
correspondent à "est", peu importe la première lettre, et qu’ils soient suivis d’au moins un caractère. Le fichier Test est donc épargné.
Exemples

                                                •   Test30

                                                •   Test30?                               rm Test30?
                                                •   Test300

Pour bien illustrer que ? nécessite vraiment la présence d’un caractère, voici un exemple avec Test30. Puisqu’il n’y a pas de caractère après 0, le teste échoue et le
fichier est épargné.

Voici aussi pourquoi ces caractères sont à déconseiller dans vos noms de fichiers. Imaginez que le fichier "Test30" avait été appelé "Test30?", mais qu’il y aurait aussi eu
un "Test300". Si vous omettez la barre oblique avant le ? dans l’expression, vous supprimerez le fichier Test300 aussi.
Entrée et sortie standard

                                              •   Chaque programme, et donc commande, a une
                                                  entrée et une sortie standard

                                              •   Par défaut, l’entrée est le clavier, et la sortie l’écran
                                                  du terminal

                                              •   Autant la sortie que l’entrée peuvent être redirigées
                                                  vers un fichier ou un autre programme

Abordons maintenant un concept important des exécutable sous UNIX: l’entrée et la sortie standard.
Chaque programme, et donc chaque commande a au moins une entrée et une sortie, même si il ne l’utilise pas. Par défaut, lorsqu’on lance un programme depuis le
terminal, le clavier est branché à l’entrée du programme, et l’écran du terminal à sa sortie. Ainsi, on peut dire que le programme prend le contrôle du terminal.
Or, il est aussi possible de rediriger ces entrées et ces sorties vers des fichiers, voir même d’autres programmes.
Entrée et sortie standard
                                                                 code retour

                                                        programme arguments ...           stdout
                                                        CWD=/home/moi
                                                stdin
                                                        EDITOR=emacs −rv
                                                                                          stderr

                                                                                  Source de l’image: C. Queinnec et V. Ménissier-Morain

Version graphique des entrées/sorties d’un programme
Redirection de la sortie
                                                •   Un symbole: >

                                                •   Exemple de commande:

                                                    •   echo "test"

                                                        •   Répète les arguments à la sortie standard

                                                    •   echo "test" > fichier_test

                                                        •   Un fichier fichier_test est créé et contient le mot "test".

                                                    •   ls > liste_fichiers

                                                        •   Le fichier "liste_fichiers" contient le nom de tous les fichiers dans le
                                                            dossier en cours

Voyons tout d’abord la redirection de la sortie vers un fichier. Le symbole à utiliser est le signe plus grand que, qui fait penser un peu à une flèche.
Nous introduisons ici une nouvelle commande, "echo", qui ne fait que répéter les arguments en sortie standard. Par exemple, echo "test" ne fera qu’afficher le mot "test"
sur une ligne à l’écran du terminal.
Or, si je redirige la sortie de la commande echo vers un fichier, le mot "test" n’apparaitra pas à l’écran du terminal, mais un nouveau fichier sera créé, et il contiendra le
mot "test" sur une seule ligne. C’est une façon primitive, mais extrêmement utile, de mettre du contenu dans un fichier texte. Par exemple, si vous vouliez une liste de
tous les fichiers d’un dossier dans un fichier texte, vous n’avez qu’à rediriger la sortie de ls.
Le tuyau
                                                  •   Un symbole: |

                                                  •   Redirige la sortie d’une commande vers l’entrée
                                                      d’une autre

                                                  •   Exemple de commande:

                                                      •   less fichier

                                                      •   cat fichier | less

Maintenant, pour rediriger la sortie vers un autre programme, on utilise ce qu’on appelle le "tuyau", ou "pipe", avec le symbole de la barre verticale.
Voyons maintenant deux commandes: less, qui permet d’afficher de long fichiers à l’écran en défilant au clavier, et "cat", qui lit le contenu d’un fichier et le balance
directement à la sortie standard.
La plupart des commandes nécessitant un fichier comme argument se dirige vers l’entrée standard lorsqu’on n’en spécifie pas.
Ainsi, "less fichier" va faire défiler le fichier à l’écran, mais "less" seul attend qu’on lui envoie des données à son entrée standard. En utilisant cat et en dirigeant sa sortie
vers less, on obtient le même résultat.
Pour terminer, voici quelques illustrations des commandes précédentes
echo "test"

                                                               echo

Ici, on affiche tout simplement le mot "test" dans le terminal
echo "test" > fichier

                                                echo   fichier

Ici, on écrit le mot test dans un fichier
less fichier

                                             fichier   less

Ici, on fait défiler le contenu du fichier
cat fichier | less

                                                        cat             less

                                                    fichier

Ici c’est la même chose, mais avec un intermédiaire pour montrer le tuyau
cat > fichier

                                                                                        cat              fichier

Et finalement, une variation, ou tout ce qu’on entre au clavier après le lancement de la commande "cat" sera inscrit dans un fichier.

Pendant le TD2, nous verrons des exemples avec des commandes plus complexes de l’utilité de cette technique, notamment avec l’utilitaire "grep".
Vous pouvez aussi lire