MO101 Introduction à UNIX Cours 2 François FERLAND, U2IS 2016 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 Composition des fichiers Information sur les imprimantes à l ENSTA Construction de commandes Écriture et lecture de fichiers Redirection Aujourd hui, nous verrons: Un peu plus de détails sur la composition des fichiers; Un peu d information sur l impression à l ENSTA; 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.
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, soit 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 et 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 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 point 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.
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 Maintenant, pour clore le contenu des fichiers, 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 SIE si vous avez des questions particulières à ce sujet.
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 Test2 rm * 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 Test2 rm A* 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 Test2 rm Test* 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 Test2 rm Test? 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 Test2 rm?est?* 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? Test300 rm Test30? 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és 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.
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".