Cours generale sur Unix : notions sur les principaux caracteristiques du systeme

Cours générale sur Unix : notions sur les principaux caractéristiques du système
…
- Evolution d’Unix:
L’histoire du système d’exploitation Unix commence en 1969 aux Bell Labs (laboratoires de recherche en informatique d’A.T.&T.). C’est pour répondre aux besoins des ingénieurs de la société que Ken Thompson écrit un système interactif, qui met l’accent sur les utilitaires de développement de logiciels, le partage de fichiers et les outils de documentation qui allait devenir Unix. Ce nom d’Unix a été attribué par opposition au système Multics (vaste projet du M.I.T.). La première évolution interne marquante d’Unix a été sa réécriture (par Ken Thompson et Denis Ritchie) en langage C, lequel a été inventé pour la cause en 1971. En 1975, le système Unix (v6) est distribué aux universités et aux centres de recherches. La principale université qui va travailler sur Unix est l’université de Berkeley, qui va produire ses propres versions appelées BSD pour Berkeley Software Distribution. En 1979, les Bell Labs sortent leur version appelée v7, avec en particulier, l’ajout de nouveaux utilitaires et un effort en matière de portabilité. Cette version est la première à être diffusée dans le monde industriel. On peut dire qu’elle est à l’origine du développement du marché Unix.
Au début des années 80, une modification de la législation américaine autorise A.T.&T. à commercialiser lui-même ses propres produits qui sont alors appelés System. C’est à cette époque que Microsoft propose sa propre version d’Unix appelée Xenix et destinée aux micro-ordinateurs. A Berkeley, les efforts portent sur l’intégration des protocoles réseaux TCP/IP, la gestion de la mémoire avec l’introduction de la pagination (alors qu’A.T.&T. reste fidèle quand à lui à la segmentation), la modification de certains paramètres du système (taille des blocs, nombre des signaux...) et l’ajout d’outils (l’éditeur vi, un interpréteur de commandes csh...). Cette prolifération des systèmes «Unix» a engendré un certain nombre de problèmes de compatibilité car chacun allant dans sa propre direction, il y avait alors plusieurs systèmes Unix. Plusieurs facteurs vont alors jouer pour canaliser et recentrer l’offre Unix: la complexité croissante des systèmes et l’action des utilisateurs.
En 1983, A.T.&T. sort la version System V, qui est issue de la v7 et qui sera enrichie au fur et à mesure par de nouvelles versions (releases). Dans le même temps, Berkeley, propose sa version 4.2 BSD (avec les fonctionnalités réseau) qui va servir de base pour de nombreux constructeurs (Sun Microsystems, Digital...) et lui permettre d’entrer dans le monde industriel. Ces deux produits marquent la fin des systèmes Unix-like en raison de leur importance par rapport à la version de référence, la v7. La fin des années 80 est marquée par une croissance sans précédent du nombre de systèmes Unix dans le domaine des systèmes d’exploitation. Tous les constructeurs proposent une solution Unix à leur catalogue (on trouve alors trois grandes familles: les versions basées sur System V, celles issues de BSD et les versions Xenix sur micro).
Le début des années 90 est marqué par le regroupement des constructeurs au sein de deux organisations: l’U.I. (Unix International) créée à partir de l’accord entre A.T.&T. et Sun Microsystems d’une part et l’O.S.F. d’autre part. Le premier accord a comme objectif la convergence entre les versions System V et 4.2 BSD. La première réalisation est la version System VR4 (System V release 4) qui réalise la synthèse entre SunOS (version Unix de Sun conçue sur la base BSD), Xenix et System V. L’O.S.F., quand à lui s’est fixé comme objectif de réaliser un système, appelé OSF/1, construit sur un noyau Unix et intégrant les fonctionnalités apportées par ses membres (multifenêtrages, graphismes, bases de données...) de manière à disposer d’un environnement ouvert commun aux différentes architectures des constructeurs. La principale réalisation à l’heure actuelle de l’O.S.F. est Motif qui définit un ensemble de normes au niveau de la présentation sur un environnement multifenêtré.
- Philosophie d’Unix:
Conçus à l’origine comme un environnement de développement, Unix est aujourd’hui un système complet intégrant un grand nombre de fonctionnalités organisées en couches logicielles. en dehors de cette structure modulaire, Unix se caractérise également par les concepts introduits en matière de gestion de fichiers et de gestion des processus.
2.1 Caractère universel d’Unix:
Une des premières caractéristiques d’Unix est son écriture (à hauteur de 95%) en langage C, permettant ainsi une portabilité sur la plupart des architectures en allant des micro-ordinateurs jusqu’aux supercalculateurs. Mais cet atout ne suffit pas à lui seul à expliquer l’expansion d’Unix. Sa popularité est, en fait, due à sa conception modulaire avec des interfaces bien définies ainsi que la disponibilité d’outils simples qui coexistent entres elles. Alors que les autres systèmes d’exploitation ressemblent à des ensembles monoblocs et relativement fermés, la conception du système repose sur différents niveaux bien distincts: le noyau, un interpréteur de commandes (le shell), des bibliothèques et un nombre important d’utilitaires.
Bibliothèques
Noyau primitives
Matériel: UC, disques, périphériques
Chapitre 1: Caractéristiques générales du système Unix
2.1.1 Le noyau:
Le noyau est la partie centrale d’Unix. Il est résident, il se charge en mémoire au démarrage. Sa structure est modulaire, ce qui rend aisées ses manipulations en termes de portabilité et l’utilisation des services qu’il offre via les primitives (ou appels systèmes). Ce fonctionnement par primitives permet de résoudre les problèmes d’accès concurrents aux informations du système. En effet, les appels systèmes font entrer l’exécution en mode noyau. Dans ce mode, le processus est assuré de garder le processeur jusqu’au retour au mode utilisateur lorsque l’appel système est terminé. Les différents noyaux Unix ont été réécrits afin de pouvoir s’adapter aux nouvelles machines multi-processeurs et de supporter le travail en temps réel. Ils sont le plus souvent réécrits en couches: les différentes fonctions du noyau sont implémentées dans des couches logicielles différentes qui communiquent entre elles par messages. La tendance actuelle est également de garder le moins de fonctions possibles dans le noyau afin de constituer un micro-noyau. Les fonctions écartées sont rejetées dans les modules exécutés en mode utilisateur.
L’interface entre le noyau Unix et les applications est définit par une bibliothèque (libc.a pour le langage C par exemple). Elle contient les modules permettant d’utiliser les primitives mais aussi des fonctions plus évoluées combinant plusieurs primitives. D’autres bibliothèques sont utilisées pour des services spécialisés (fonctions graphiques,...).
2.1.2 Le Shell:
L’interface utilisateur sous Unix est appelée shell. Lorsqu’un utilisateur tape des commandes Unix, ces commandes sont reçues par le shell qui les interprète avant de lancer l’exécution de cette commande. Le shell est une couche logicielle bien séparée du noyau. Il joue un double rôle celui d’interpréteur de commandes et celui de langage de programmation. Ce dernier rôle semblant parfois hermétique à des néophytes. Il existe plusieurs shells dont les plus répandus sont:
- le Bourne Shell (sh): le shell de base sous Unix A.T.&T.,
- le C-shell (csh): le shell Unix BSD,
- le Korn-Shell (ksh) qui est une extension du Bourne shell. Il possède toutes les com-mandes de son prédécesseur, ainsi que des commandes qui facilitent le travail de l’utilisateur comme des outils de gestion des historiques des commandes tapées...
- le Z-shell (zsh): extension de ksh, qui offre en particulier des modules de complétions des nom de programme, de fichiers, de variables utilisateur et système, l’envoie de message à l’utilisateur de correction en cas d’erreur de frappe.
L’utilisateur, à l’aide des commandes qu’il a à sa disposition, peut écrire ses propres fonctions et programmes en langage shell, ce sont alors des shellscripts. Une fois ceux-ci réalisés, ils peuvent être utilisés par l’utilisateur comme n’importe quelle commande du shell lui même.
Chapitre 1: Caractéristiques générales du système Unix
2.2 Le système de gestion de fichiers: 2.2.1 Vision générale:
Sous UNIX, les fichiers sont enregistrés dans une structure hiérarchisée en arbre. Ce système de fichiers est donc composé d’une racine et de noeuds qui sont des répertoires et des feuilles qui sont des fichiers ordinaires qui contiennent les données et les programmes.
Au niveau de l’utilisateur, les entrées-sorties sont vues de façon uniforme c’est-à-dire avec les mêmes commandes, la même syntaxe et les mêmes attributs qu’il s’agisse d’un fichier ou d’un périphérique. Par exemple, la redirection d’une commande sur un fichier ou sur un périphérique utilise la même syntaxe: commande > sortie où sortie est le nom du fichier (ordinaire ou spécial) de redirection. Mais au niveau du noyau, ce dernier effectuera l’opération de redirection soit sur le système de fichiers, soit sur le périphérique selon le type du fichier sortie. Cette vision uniforme des entrées-sorties est caractérisée par un descripteur commun à tous ces éléments, qui est appelé inode. De fait, chaque fichier Unix à un inode comprenant les attributs suivants:
- un propriétaire: celui qui a créé le fichier,
- un groupe: le groupe auquel appartient le créateur au moment où il créé le fichier,
- des droits d’accès: (voir paragraphe s’y rapportant),
- des informations générales sur la taille, la date de la dernière opération effectuée sur le fichier, le nombre de liens sur ce fichier,...
/
…
2.2.2 Les droits d’accès:
Les autorisations d’accès sous UNIX sont de trois ordres: accès en lecture (r), en écriture (w) et en exécution (x). A partir de ces trois options, on pourra effectuer toutes les opérations de base sur les fichiers (création, copie, destruction,...). Ces droits vont être donnés pour trois niveaux d’utilisateurs: pour le propriétaire, pour le groupe auquel appartient le propriétaire et pour le reste des utilisateurs. En ce qui concerne les répertoires, l’attribut x est nécessaire pour pouvoir se déplacer dans ce répertoire ou pour y rechercher un fichier.
Chapitre 1: Caractéristiques générales du système Unix
2.3 Les processus: 2.3.1 Vision générale:
Toute action, tout programme lancé est exécuté par un processus. Le processus est donc l’unité d’exécution pour Unix. Une commande entrée par un utilisateur peut ne pas créer de processus (commandes internes au shell de l’utilisateur), ou en créer un ou plusieurs. Lors de l’exécution de la commande, un processus peut être en mode utilisateur (mode normal) ou en mode noyau, mode dans lequel il entre quand il fait un appel système (par exemple pour demander plus de place en mémoire centrale). L’ensemble de ses processus apparaissent dans une table, consultable par tout utilisateur du système. Cette table recense l’ensemble des processus et donne des renseignements quand à l’utilisateur qui l’a lancé, son taux d’occupation de la mémoire centrale, son taux d’utilisation du temps CPU de la machine, son état à l’instant de l’affichage de l’image de la table...
2.3.2 Terminal de contrôle d’un processus, exécution en arrière plan:
Les processus lancés par un utilisateur sont liés au terminal depuis lequel ils ont été exécutés, et à l’utilisateur qui les a créés. Le système peut ainsi repérer les processus qui recevront un signal d’arrêt (Ctrl C par exemple). L’ensemble des processus qui partagent un terminal s’appelle un groupe de processus.
Un utilisateur peut aussi lancer un processus en arrière plan, si par exemple, il veut garder la main sur une fenêtre de commande et pouvoir bénéficier d’un autre programme. Ces processus acquièrent alors une certaine indépendance vis à vis du terminal depuis lequel ils ont été lancés: ils s’exécutent alors sans intervention de l’utilisateur et sans que celui-ci n’ait besoin d’attendre la fin de leur exécution (type de traitement en «batch»). On peut ainsi lancer plusieurs tâches simultanément. Ces processus sont alors protégés contre les annulations par clavier (d’autres mécanismes que nous verrons par la suite permettent d’arrêter ces processus). D’autres processus sont quand à eux lancés par le système ou par un utilisateur en fonction de ses besoins (cas de l’impression ou du mail), ils sont alors gérés par le système et sont appelés des daemons.
2.3.3 La propriété effective et réelle d’un processus:
Comme nous venons de le voir un processus à un propriétaire réel, qui est l’utilisateur qui l’a commandé. Il peut avoir aussi un propriétaire effectif, c’est à dire l’utilisateur a qui appartient le fichier exécutable (si le set user bit a été positionné). C’est le cas par exemple de la commande de changement de mot passe qui nécessite l’écriture dans des fichiers protégés et dans lequel seul l’administrateur système doit avoir le droit d’écrire. Dans ce cas là, le propriétaire réel du processus et l’utilisateur et le propriétaire effectif root.
...
Chapitre 3: Utilisation du Shell
- Introduction:
1.1 Qu’est ce que le Shell:
Comme nous l’avons vu précédemment, le shell est le programme interface entre l’utilisateur et le noyau Unix. Il est indépendant du noyau. A ce sujet, vous pouvez choisir le shell que vous voulez lors de vos sessions de travail (par contre, un shell vous est toujours affecté par défaut pour toutes vos sessions lors de la création de votre compte). Il a plusieurs rôles: il interprète les commandes passées par l’utilisateur afin qu’elles soient traitées par le noyau; il a aussi la fonction de langage de programmation, il est utile pour prototyper des applications, pour effectuer certaines tâches simples et répétitives. Le langage des scripts pouvant paraître compliqué au premier abord pour un non initié, on préférera utiliser le langage Perl (de plus en plus répandu et se rapprochant du langage C, il est aussi très utilisé dans l’écriture de scripts CGI pour tout ce qui concerne les interfaces entre les programmes utilisateurs et le langage HTML).
1.2 Les différents utilisateurs:
Nous allons voir dans cette partie les différents niveaux d’utilisateurs sous Unix. Quel que soit le type d’utilisateur, il y a un certain nombre de paramètres en commun.
Un utilisateur quelconque sous Unix est repéré par son nom (login) qu’il doit taper pour pouvoir entrer dans le système. A chaque nom, correspond un numéro d’utilisateur: l’uid. L’uid est donc le moyen pour le système de reconnaître l’utilisateur (en ce qui concerne l’attribution de la possession d’un fichier par exemple).
Afin d’authentifier l’utilisateur, un mot de passe lui est attribué lors de la création de son compte. Ce mot de passe est «secret», il ne doit pas être divulgué à autrui. De plus, en cas de problèmes lors de l’entrée dans le système sur le mot de passe, vérifiez le type de clavier que vous utilisez, que vous n’êtes pas en mode majuscule, et cas échéant, si vous avez oublié votre mot de passe, allez voir votre administrateur système afin qu’il le change. Il répond à des conditions bien précises de création. Par exemple, au MBDS, il vous faut donner un mot de passe de 8 caractères avec au moins 2 caractères non alpha-numériques.
L’utilisateur appartient aussi à au moins un groupe de travail et par la même a un numéro de groupe par défaut: le gid. En fonction de projets, et au vue de la notion de droits, un utilisateur peut donc appartenir à plusieurs groupes d’utilisateurs.
Lors de la création du compte, l’administrateur système fixe un répertoire de travail par défaut (la HOME dir) dans lequel l’utilisateur sera positionné à l’entrée dans le système. En règle générale, le nom terminal du chemin de ce répertoire représente le nom de login de l’utilisateur. De façon générale, l’utilisateur est propriétaire de son répertoire HOME.
Chapitre 3: Utilisation du Shell
Par défaut aussi, et lors de la phase de création du compte, on donne à l’utilisateur un shell qui sera exécuté lors de l’entrée dans le système.
En résumé, à un utilisateur correspond les renseignements suivants:
- un nom de login,
- un mot de passe,
- un iud,
- un ou plusieurs groupes de travail,
- un répertoire HOME,
- un shell par défaut.
Les informations que nous venons de donner ci-dessus sont enregistrées dans le fichier: /etc/passwd (/etc/group pour tout ce qui concerne les groupes. Pour des raisons de sécurité et de commodité, l’administrateur utilisera des outils de gestion du système type NIS ou Kerberos. Dans ce cas là, le fichier /etc/passwd ne contient que certaines informations sur certains utilisateurs, le reste étant placé dans les fichiers relatifs au système de gestion utilisé.
1.2.1 L’utilisateur de base:
Il utilise les applicatifs mis à sa disposition, il «customise» les applications, il possède des droits d’accès traditionnels, il doit veiller à utiliser les ressources (disques, CPU,...) avec modération afin de ne pas surcharger le système.
1.2.2 Le programmeur:
Il possède le même droits que l’utilisateur de base, il a en plus la possibilité de programmer ses propres applications, il utilise donc dans ce cas, les outils de développement installés sur le système, il a accès aux compilateurs et aux interpréteur.
1.2.3 L’administrateur système:
Il possède les mêmes droits que le programmeur. Son rôle est plus grand: il gère le système, il possède des droits d’accès étendus (il peut descendre dans toutes les arborescences de son système), il crée des comptes pour tous les utilisateurs de son serveur, il veille au bon fonctionnement général du système, il installe les outils nécessaires à la communauté, il surveille et régularise la charge du système et des ressources de la machine.
Chapitre 3: Utilisation du Shell
Utilisation:
L’étudiant Scott Tiger arrive au MBDS et est enregistré par l’administrateur système avec les attributs suivants:
- nom de login: tiger
- passwd: pwd4s-t;
- groupe: students-mbds
- uid: 10000
- home-dir: /u/students/mbds##/tiger
- e-mail:
Lorsqu’il a entré tous ces attributs dans les fichiers système, l’administrateur crée son arborescence et lui installe les fichiers de base d’environnement:
- .Xdefaults (fichier de ressources pour les clients X-Window),
- .kshrc (fichier de configuration des paramètres
- .profile (fichier de démarrage lu et exécuté par le shell),
- .mh-profile (fichier de configuration du programme xmh, servant à la lecture des mails),
- Mail (répertoire qui contiendra l’ensemble des messages reçus et la définition des mas-ques de saisie des mails),
- lib/X11/app-defaults (arborescence dans laquelle seront définies les fichiers de config-uration concernant l’apparence des fenêtres à l’écran),
- script (répertoire contenant les scripts de base permettant de lancer l’interface X).
Une fois ce travail effectué, Scott Tiger a la possibilité d’ouvrir une session de travail sur toutes les machines qu’il a à sa disposition dans les salles machines du MBDS. Il commencera par être un simple utilisateur qui «customisera» ses fichiers de démarrage, il deviendra très rapidement un programmeur au fur et à mesure de l’avancement des cours (Unix, C, C++,...). Il ne sera jamais administrateur du système.
1.3 Exemple de session utilisateur:
Après avoir été créer votre compte, vous pouvez commencer à entrer dans le système, pour cela, entrez votre nom de login et votre mot de passe (ces derniers sont identiques sur toutes les machines du réseau). Après authentification, votre shell de base se lance et exécute les fichiers /etc/profile, —/.profile et —/.kshrc afin de fixer vos variables d’environnement (TERM, PATH, MANPATH...). Le répertoire HOME qui vous a été affecté devient alors le répertoire courant. Pour lancer l’interface graphique, tapez x11.
Chapitre 3: Utilisation du Shell
Utilisation:
Par exemple pour notre utilisateur Scott Tiger:
machine login: tiger password:
machine$ -- vous êtes entrés sur le système
-- et vous êtes en mode caractères
machine$ x11 -- vous lancez l’interface graphique
et vous arrivez sur un écran de ce type:
- Le Shell:
2.1 Entrée dans le système:
Lorsqu’un terminal est allumé, les processus système sont lancés et en particulier celui qui s’occupe de gérer «l’arrivée» de nouveau utilisateur (le daemon du programme login). A ce moment, vous pouvez entrer votre nom d’utilisateur et votre mot de passe afin de démarrer votre session.
Chapitre 3: Utilisation du Shell
2.1.1 Changer son mot de passe:
Vous avez fixé votre mot de passe avec l’administrateur système le jour où vous vous êtes fait recenser sur le réseau. Si vous souhaitez changer de mot de passe, la commande permettant de réaliser cette opération est: passwd ou yppasswd.
Utilisation:
machine $ yppasswd
Changing NIS password for USER on MACHINE.
Old password: -- entrez votre mot de passe courant
New password: -- entrez votre nouveau mot de passe
Retype new password: -- rentrez votre mot de passe
NIS entry has changed on MACHINE.
Les règles concernant le mot de passe ont été citées plus haut. Attention toutefois, le système Unix les majuscules et les minuscules ne sont pas équivalentes.
2.1.2 Format général des commandes:
La syntaxe générale des commandes Unix est: commande options... arguments...
Les options sont le plus souvent précédées par un tiret «-». L’ordre des options est le plus souvent indifférent et peuvent être regroupées derrière un seul tiret. Les arguments quand à eux peuvent être absents et, dans ce cas là, ils prennent des valeurs par défaut.
Par exemple:
- ls
- ls -lia
- ls -l /net
- ls *foo*
2.1.3 Astuces pour se déplacer sur la ligne de commandes:
Il existe sous Unix certains raccourcis clavier utiles pour se déplacer sur la ligne de commandes ou pour rappeler une commande précédemment lancée. Voici une liste succincte de ces raccourcis:
- Ctrl A: pour revenir en début de ligne,
- Ctrl E: pour aller à la fin de la ligne,
- Ctrl F: pour se déplacer vers la droite,
- Ctrl B: pour se déplacer vers la gauche,
- Ctrl D: pour effacer le caractère à droite du curseur,
- Backspace: pour effacer le caractère à gauche du curseur,
- Ctrl K: pour supprimer la fin de la ligne,
- Ctrl P: pour revenir à la commande précédente,
- Ctrl N: pour passer à la commande suivante (dans la liste des commandes),
- Ctrl R + début de la commande: pour retrouver une commande dans la liste,
- Ctrl S: pour interrompre la transmission des caractères entre le programme et l’écran,
- Ctrl Q: pour libérer tous les caractères depuis le Ctrl S précédent,
- Ctrl C: pour interrompre l’exécution d’un programme,
- Ctrl Z: permet de suspendre un processus en avant plan, d’exécuter une commande ou de placer le job en arrière plan (+bg) ou de le ramener en avant plan (+fg).
Chapitre 3: Utilisation du Shell
2.1.4 Le manuel en ligne:
Une aide en ligne est disponible sous Unix et la plupart des commandes sont présentes dans ce manuel. La commande man permet de consulter ce manuel. La syntaxe générale est la suivante:
man [section] nom_ de_la_commande
Si la page existe (si elle est trouvée dans l’une des arborescences définies dans la variable MANPATH), le système la formate et l’affiche à l’écran. En règle générale, la réponse a beaucoup de problèmes se trouve dans ces pages. N’hésitez donc jamais à les consulter.
Attention toutefois, certaines commandes peuvent apparaître plusieurs fois dans la liste des pages de manuel. En effet, certaines fonctions sont utilisées dans plusieurs cas de figures; par exemple, la commande if..then..else peut être aussi bien une commande Unix, qu’une commande C, ou C++ ou Perl... dans ce cas, il existe donc plusieurs pages se référant à cette commande (plusieurs sections contiennent des informations sur cette fonction), il faut faire donc attention à appeler la bonne page de manuel. Pour cela, il existe un moyen de connaître toutes les pages de manuel se référant à un mot clé donné:
man -k mot-clé
l’utilisateur verra une ligne pour chaque entrée du manuel concernant ce mot-clé.
Utilisation:
Dans le cas de la recherche par exemple portant sur la commande file (cette commande a plusieurs utilités dans plusieurs cas sur le système) qui sous Unix détermine le type d’un fichier, selon l’ordre des chemins dans la variable MANPATH, on obtient:
machine $ man file
file(n) Tcl Built-In Commands file(n)
NAME
file - Manipulate file names and attributes
SYNOPSIS
file option name ?arg arg ...?
on voit donc ici que cette page ne correspond pas aux attentes de l’utilisateur. Il doit donc consulter le manuel par mot-clé et trouver le fichier qui correspond à ses besoins: machine $ man -k file
file (n) - Manipulate file names and attributes
mh-profile (5) - user profile customization for MH message handler
mh-profile (l) - user profile customization for MH message handler
rcsfile (5) - format of RCS file
refile (1) - file message in other folders
refile (l) - file message in other folders
shrinkfile (1) - shrink a file on a line boundary
tiffgt (1) - display an image stored in a file (Silicon Graphics version)
file (1) - determine the type of a file by examining its contents
mkfile (8) - create a file
rasterfile (5) - Sun's file format for raster images
sccsfile (5) - format of an SCCS history file
...
Chapitre 5: Le Shell - Langage de programmation
Nous venons de voir les principales fonctionnalités du shell lui-même puis, son aspect interpréteur de commande, nous allons voir dans ce chapitre le rôle langage de programmation du shell.
- Tests divers:
La commande:
test condition && alors || sinon
ou
[ condition ] && alors || sinon
est utilisée dans de nombreux cas par les structures de contrôle du shell. Cette commande renvoie 0 si la condition est vérifiée et une valeur différente de 0 sinon. Dans la deuxième syntaxe, il faut faire attention à mettre des espaces entre les crochets et la condition.
Voici les principales conditions:
- -d fichier: vrai si fichier est un répertoire (et si il existe),
- -e fichier: vrai si le fichier existe,
- -f fichier: vrai si fichier est un fichier ordinaire (et si il existe),
- -r fichier: vrai si l’utilisateur a le droit d’accès en lecture sur fichier (s’il existe),
- -w fichier: vrai si l’utilisateur a le droit d’accès en écriture sur fichier (s’il existe),
- -x fichier: vrai si l’utilisateur a le droit d’accès en exécution sur le fichier (s’il existe),
- -c fichier: vrai si le fichier est un fichier caractère spécial (et si il existe),
- -b fichier: vrai si le fichier est un fichier bloc (et si il existe),
- -s fichier: vrai si fichier n’est pas vide,
- -L fichier: vrai si fichier est un lien symbolique,
- fichier1 -nt fichier2: si fichier a été modifié plus récemment que fichier2,
- -n chaîne: vrai si chaîne n’est pas vide,
- -z chaîne: vrai si chaîne est vide,
- nb1 eq nb2: vrai si les deux nombres entiers nb1 et nb2 sont égaux, on peut rem¬placer eq par ne (différent), gt (supérieur), ge (supérieur ou égal), lt (inférieur), le (inférieur ou égal).
- chaine1 = chaine2: vrai si les deux chaînes sont identiques,
- chaine1 != chaine2: vrai si les deux chaînes ne sont pas identiques,
- -a: opérateur logique et,
- -o: opérateur logique ou,
- !: négation logique
Utilisation:
machine $ test -f fichier && echo fichier || echo pas fichier
machine $ test \( -d rep -o -f fic \) -a $variable=2 && echo ok || echo non ok
Chapitre 5: Le Shell - Langage de programmation
- Décaler la position des paramètres:
Dans un shellscript, nous savons récupérer, à l’aide des variables spéciales, le contenu des paramètres passés. Il est parfois utile de pouvoir mettre ces paramètres dans un ordre voulu. La commande:
shift [n]
permet de déclarer les paramètres de n positions. Par défaut, la valeur de n est 1, dans ce cas là, $2 devient $1, $3 devient $2 etc...
- Sortie d’un shellscript:
Pour sortir d’un shellscript et renvoyer un code de retour, utiliser la commande: exit n le code de retour est alors n. Si le shellscript ne se termine pas par un exit, il renvoie le code de retour de la dernière commande exécutée.
- Les structures de contrôle:
Nous venons de voir que toutes les commandes Unix renvoient un code qui est un nombre entier. En général, si la commande s’est bien déroulée, elle renvoie 0, sinon elle renvoie un nombre négatif ou positif.
Comme dans tout langage de programmation, il y a dans le shell Unix un certain nombre de fonctions qui assurent le contrôle des données et des paramètres:
4.1 if..then..else..fi:
La commande:
if test
then liste_ de_commandes
else liste_de_commandes
fi
teste la valeur renvoyée par le test après le mot if et en fonction de ce code, lance la liste de commande appropriée (si le code=0 alors on exécute les commandes après le mot then sinon les commandes après le mot else).
Utilisation: programme qui supprime interactivement selon la réponse
machine $ echo -n "Suppression interactive ?"
read reponse
if test "$reponse" = oui
then rm -i $@
else rm $@
fi
Il existe une variante pratique de if: if condition
then ligne_ commande elif condition2
then ligne_commande
...
Chapitre 5: Le Shell - Langage de programmation
4.2 case..esac:
Nous avons aussi besoin de structures permettant de faire des chois multiples: case mot in modèle 1) liste_ commande;;
..
modèle n) liste_commande;;
*) liste_commande;;
esac
Le premier modèle rencontré qui répond à la valeur de mot indique la liste de commandes à exécuter. Si mot ne correspond à aucun modèle, l’instruction se poursuit jusqu’à la condition *) et si celle-ci n’existe pas, jusqu’au esac.
Les modèles sont de la forme:
valeur1 | valeur2 | ... | valeurn
Dans les modèles, on peut utiliser les caractères spéciaux *, ?, [] comme dans le cas de la recherche d’un fichier.
Utilisation: programme qui supprime interactivement selon la réponse
machine $ echo -n "Suppression interactive ?"
read reponse
case $reponse in
o|O|oui|OUI) rm -i $@;;
n|N|non|NON) rm $@;;
*) echo "Réponse non valide"
-- rappel du shellscript;;
esac
4.3 for..do..done:
Certains traitement sont répétitifs, une commande doit être lancée pour un grand nombre de paramètres du shellscript. Ceci nécessite l’usage d’une fonction qui boucle sur tous ses paramètres. La commande:
for variable [in mots...]
do
liste_commandes
done
variable prend tour à tour toutes les valeurs de la liste des mots (qui suivant in). Pour chacune de ces valeurs, la liste de commandes est exécutée. Si «in mots...» n’est pas présent, variable prend toutes les valeurs du script, ce qui est équivalent à «for variable in $@».
Utilisation: programme qui recopie tous les fichiers *.c du répertoire courant dans une autre (afin d’en faire la sauvegarde)
machine $ for i in *.c > do
> cp $i rep/
> done
Chapitre 5: Le Shell - Langage de programmation
4.4 while..do..done:
La commande:
while liste_ de_commandes1
do
liste_de_commandes2
done
exécute la liste de commandes 2 tant que le code retour de la liste de commandes 1 est 0.
Utilisation: programme qui affiche tous les paramètres d’un script (un par ligne) machine $ while test $1
> do
> echo $1
> shift
> done
4.5 until..do..done:
Cette commande est semblable à la précédente à la différence près que la sortie de la boucle s’effectue si la liste de commandes qui suit until renvoie 0.
Syntaxe de la commande:
until liste_de_commandes1
do
liste_de_commandes2
done
4.6 Instructions liées aux boucles:
A l’intérieur de ces différentes structures, il est important que l’utilisateur puisse fixer lui même et selon ses propres critères la sortie de boucles.
La commande:
continue [n] permet de sauter à la fin de la boucle et de recommencer une nouvelle boucle.
La commande:
break [n]
provoque, quand à elle la sortie de la boucle en cours et passe à l’instruction qui suit la boucle.
Dans les deux cas, l’entier n permet d’indiquer que l’action se porte sur une boucle externe.
Par exemple, break 2 sortira de la boucle qui englobe la boucle dans laquelle cette instruction est écrite.
Chapitre 5: Le Shell - Langage de programmation
- Commandes «built-in» diverses:
Un certain nombre de commandes sont contenues dans le shell lui-même. Ce sont des mots réservés. En voici une liste succincte:
- cd: permet de changer de répertoire courant,
- eval chaînes...: interprète les chaînes et les exécute comme si elles avaient été tapées au clavier. Par exemple: eval dernier_paramètre=’$’{$#} affecte à la variable dernier_paramètre le numéro de la dernière valeur passée au shellscript,
- exit: termine le shell courant,
- exec commande: la commande est exécutée dans le shell courant; le sortie de cette commande est la même que celle du shell courant, on ne revient donc jamais d’un exec,
- export: exporte les variables dans l’environnement,
- read: lit la ligne sur l’entrée standard et affecte les variables données en argu¬ments,
- readonly: les variables données sont positionnées mais non modifiables,
- set: permet de modifier les options du shell courant (voir plus loin),
- shift: décale d’un cran vers la gauche la liste des paramètres,
- trap [liste_de_commandes] n...: spécifie le comportement du shell en fonction des interruptions, la liste de commandes sera exécutée si le programme reçoit un des signaux dont le numéro est n; si n égal 0 alors la liste de commandes sera exécutée à la sortie du shell en cours,
- umask: permet de changer le masque de création par défaut des autorisations sur un fichier,
- wait [n]: attends la fin d’une commande lancée de manière asynchrone, l’entier n spécifie le numéro du processus père de celui que wait attends,
- :: cette commande ne fait rien mais évalue ses arguments, elle renvoie le code 0 ce qui permet de créer des boucles infinies,
- .: exécute le fichier donné en argument dans le shell courant
La commande:
set [options]
permet de déterminer les caractéristiques des variables d’environnement du shell courant et de ses descendants.
Plusieurs options sont possibles, les plus utilisées sont:
- -a: exporte automatiquement toutes les variables qui sont définies ou modifiées ultérieurement,
- -e: sort immédiatement si une commande retourne un statut différent de 0,
- -f: supprime la génération des noms de fichiers,
- -h: localise et mémorise les commandes «fonctions» au moment de leur définition (en général, les fonctions sont localisées au moment de leur exécution),
- -k: tous les arguments sont chargés dans l’environnement, et pas seulement celles que précède le nom de la commande,
- -n: lit les commandes mais ne les exécute pas, il en vérifie simplement la syntaxe,
- -t: sort après exécution de la commande,
- -u: traite les variables non fixées comme des erreurs au moment de la substitution,
- -v: pour faire afficher les lignes d’un shellscript au moment où elles sont lues par le shell,
- -x: affiche chaque commande et ses arguments précédés par le signe +,
- +option: pour inhiber la commande set -option précédente.,
Chapitre 5: Le Shell - Langage de programmation
- Calculs, traitements des chaînes de caractères:
Nous allons voir dans cette partie plus en détail la commande: expr arguments...
Cette commande évalue les arguments comme une expression. Le résultat est envoyé sur la sortie standard. Ce n’est pas une commande interne au shell.
arguments est une expression comprenant des opérateurs. Les opérateurs suivant sont classés par ordre de priorité croissante et regroupés par groupes d’égale priorité:
- exp1 \ | exp2: retourne exp1 si elle est non nulle et non vide, sinon retourne exp2 si exp2 est non nulle et non vide, sinon retourne 0;
- exp1 \ & exp2: retourne exp1 si aucune des expression n’est vide ou nulle, 0 sinon,