MO201 Cours 2 Introduction à UNIX - ensta
←
→
Transcription du contenu de la page
Si votre navigateur ne rend pas la page correctement, lisez s'il vous plaît le contenu de la page ci-dessous
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