• Aucun résultat trouvé

SYSTEME D’EXPLOITATION UNIX,LANGAGE ET INTERPRETE DE COMMANDES,PROCEDURES DE COMMANDES

N/A
N/A
Protected

Academic year: 2021

Partager "SYSTEME D’EXPLOITATION UNIX,LANGAGE ET INTERPRETE DE COMMANDES,PROCEDURES DE COMMANDES"

Copied!
22
0
0

Texte intégral

(1)

ISMRA - ENSI DE CAEN ANNEE 2002-2003

SYSTEME D’EXPLOITATION UNIX,

LANGAGE ET INTERPRETE DE COMMANDES, PROCEDURES DE COMMANDES

Pour toute correction, suggestion, critique, envoyez vos messages à

Christine Porquet ([email protected])

(2)

1. Quelques mots sur UNIX

Unix est un système d’exploitation en temps partagé, multi-tâches et multi-utilisateurs. Unix se décompose en un certain nombre de modules avec une architecture faite de couches successives autour d’un noyau logiciel. Les couches sont agencées en fonction d’une abstraction croissante : du noyau en contact avec le matériel vers les applications que manipulent les utilisateurs.

1.1. Le noyau

Le noyau est chargé de la gestion du processeur, de la mémoire, des ressources physiques. Il pilote directement le matériel et il offre les services suivants :

· gestion des interruptions et des erreurs

· gestion et ordonnancement des processus

· gestion de la mémoire

· services d’entrée/sortie (gestionnaires de périphériques – drivers)

· gestion et sécurité des fichiers

· date et heure

· comptabilité du système.

Le noyau fournit une interface d’environ 80 fonctions en langage C. Elles forment une couche de programmation grâce à laquelle un programmeur va construire d’autres programmes ou applications. Un programme appellera ces fonctions quand il désirera exploiter les capacités du système. Ces fonctions sont appelées des appels système. Pour d’autres systèmes qu’Unix, on trouve aussi le terme d’API – Application Programming Interface – pour nommer l’ensemble de ces fonctions de base.

Les appels système sont à peu près identiques sur tous les systèmes de type Unix quelles que soient les différences matérielles sous-jacentes. Ils sont normalisés par la norme POSIX pour les plus récents. C’est ce qui fait que l’apprentissage et la programmation d’un système d’exploitation Unix est relativement indépendant de la machine : PC, Sun, HP, IBM, etc.

Il faut cependant comprendre que malgré une interface de programmation identique, les noyaux Unix sont différents. Ils communiquent directement avec les éléments matériels et certaines parties doivent être adaptées à des caractéristiques patriculières. C’est le cas de la gestion de la mémoire ou des dispositifs d’entrée/sortie.

Ceci explique que la portabilité logicielle d’une application Unix ne se fait qu’au niveau du code source. Le code exécutable sera différent suivant le processeur, les systèmes d’entrée/sortie et les conditions matérielles. Sur ce point, Unix s’oppose à Windows qui assure la portabilité du code exécutable. Windows en revanche ne tourne que sur des processeurs Intel et des architectures PC d’origine Intel. On oppose souvent l’univers Unix au monde “ Wintel ”.

1.2. À l’extérieur du noyau

En dehors du noyau, un système Unix possède normalement :

· un interprète de commandes : le shell

· des commandes ou des utilitaires

· des applications ou programmes utilisateurs.

(3)

1.2.1. Les commandes

Les commandes Unix constituent un ensemble de plus de 300 programmes fournis avec le système Unix. Les commandes sont appelées par leur nom via l’interprète de commandes, le shell. Elles permettent à l’utilisateur de piloter l’ordinateur : changer son mot de passe, créer et réorganiser ses fichiers, lancer un programme, etc. On peut dire que les commandes organisent les services du noyau en un ensemble de fonctions utilisateurs.

Il est hors de question d’introduire ici l’ensemble des commandes d’Unix. Cependant, tous les utilisateurs doivent en connaître un certain nombre : listage des fichier – ls, destruction – rm, etc.

Les commandes se répartissent plus ou moins en groupes fonctionnels, par exemple :

· les commandes de gestion des dossiers et des fichiers

· les commandes de gestion des processus

· les commandes réseaux

· les commandes d’administration du système.

1.2.2. L’interprète de commande – le shell

L’interprète de commandes ou le shell permet le dialogue entre la machine et l’utilisateur : il accepte les commandes de l’utilisateur et il les exécute. Les commandes ont en général la syntaxe suivante :

nom_commande -liste_options liste_paramètres par exemple :

ls -la

liste les fichiers avec les détails – option l – et les fichiers cachés – option a, all –. On peut utiliser le caractère “ ? ” pour remplacer n’importe quel caractère et le caractère “ * ” pour remplacer n’importe quelle chaîne de caractères, par exemple

rm fic?

détruit tous les fichiers de 4 lettres commençant par fic et rm fic*

détruit tous les fichiers commençant par fic.

Le shell veille à ce que les fonctions se terminent correctement; dans le cas contraire, le shell avertit l’utilisateur d’une erreur. Nous allons revenir sur son utilisation et les facilités qu’il offre dans le paragraphe 6.

1.2.3. Les applications Unix

En dehors des programmes que l’on écrit soi-même, il est possible de se procurer un nombre considérable d’applications dans des domaines très différents tels que par exemple :

· la gestion de bases de données

· les serveurs Web

· le commerce électronique

(4)

· la comptabilité

· la conception assistée par ordinateur

· les communications, etc.

Le nombre de programmes applicatifs est plus faible que ce qui existe avec Windows. Il y a moins de jeux par exemple. Unix est cependant un marché en croissance avec le développement de Linux et il offre sans doute plus de programmes professionnels que Windows dans les domaine de la CAO, des bases de données, etc. Lorsqu’on cherche une application informatique pour résoudre un problème, il faut s’assurer qu’il en existe une version binaire pour le matériel sur lequel elle est appelée à tourner avec une documentation adéquate ou bien rechercher un code source qu’on adaptera éventuellement et que l’on compilera sur la machine à laquelle elle est destinée.

2. Le système de fichiers

2.1. Fichiers sans structure

Unix ne propose qu’une seule forme d’organisation pour ses fichiers : ils sont traités comme une simple suite d’octets (caractères). Chaque octet est identifié par sa position relative par rapport au début du fichier, le premier octet ayant le numéro zéro. Unix permet d’accéder à un octet ou une séquence d’octets situés n’importe où dans le fichier.

Pour localiser une information dans un fichier, il suffit de donner sa position dans le fichier (position de son premier octet) ainsi que sa longueur. Ceci est valable en lecture comme en écriture.

La notion d’enregistrement n’existe pas au niveau d’Unix. Il est bien sûr souvent nécessaire de donner une structure à un fichier. Ce sont alors les programmes utilisateurs (ou les procédures du système) qui la contrôlent eux-mêmes. Le système ne s’en occupe pas.

2.2. Expansion dynamique

Unix laisse grossir les fichiers de manière dynamique au fur et à mesure de l’arrivée des informations; ceci grâce à une gestion astucieuse et efficace (voir en cours). Il existe des fichiers Unix de plus de deux gigaoctets!

2.3. Traitement identique des fichiers et des périphériques d’E/S

Les fichiers Unix se partagent en deux catégories de façon transparente à l’utilisateur : les fichiers ordinaires et les fichiers spéciaux :

· Les fichiers ordinaires sont les fichiers séquentiels avec lesquels nous avons l’habitude de travailler.

· Les fichiers spéciaux. Unix pour simplifier son interface a aboli la différence entre fichiers et périphériques d’entrée/sortie pour l’utilisateur. Ainsi, dans un programme, on pourra passer en paramètre un nom qui pourra être celui d’un vrai fichier ou d’un périphérique. Un fichier spécial est un nom servant à désigner un dispositif d’entrée/sortie, une ligne de communication ou un

“ tube ” de communication – pipe en anglais – avec d’autres programmes. Ces fichiers seront traités par le programme comme des fichiers disques ordinaires cependant un autre dispositif physique sera activé lors des opérations de lecture/écriture.

(5)

2.4. Sécurité

Les fichiers sont protégés contre des accès abusifs d’autres utilisateurs. Le mécanisme de sécurité est le même pour les fichiers ordinaires ou spéciaux. (cf. paragraphe sur les commandes de protection).

3. Structures des volumes, des dossiers et des fichiers

3.1. Cas d’un seul volume

Unix organise un disque par blocs de 1024 octets (anciennement 512). Le contenu d’un fichier est stocké dans un plusieurs de ces blocs qui peuvent être éparpillés sur le disque. Le système peut organiser les blocs selon des techniques de stockage avancées (voir cours).

Unix utilise un système de fichiers hiérarchisés ainsi que la notion de dossier (ou répertoire). Au sommet de la hiérarchie se trouve le dossier racine (root) de nom “ / ”. Tous les fichiers peuvent être atteints par un chemin dans la hiérarchie à partir du dossier racine.

/ (racine)

bin dev usr etc lib tmp

Jean Marc bin tmp

Rappelons que

· “ / ” désigne le dossier racine

· un chemin d’accès absolu à un fichier est la liste des noms des dossiers qui se trouvent sur le chemin menant de la racine au fichier

· les noms formant un chemin d’accès sont séparés par des “ / ”. Exemple : /eleves/promo00/dupont/travail/essai1

· en général, un utilisateur ne travaille à un moment donné qu’avec un nombre restreint de fichiers regroupés dans un dossier, par exemple projet, auquel il accède en frappant au clavier le chemin qui y mène ; on dit alors que projet est son dossier de travail – working directory.

· il peut alors accéder à un fichier en partant de son dossier de travail. C’est l’adresse relative du fichier. Exemple : essai1

· “ .. ” indique le dossier immédiatement supérieur dans la hiérarchie. Il peut être utilisé plusieurs fois, par exemple : ../..

· “ . ” désigne le dossier courant.

Le système d’exploitation peut créer plusieurs disques différents appelées des partitions sur un seul disque physique.

(6)

3.2. Cas de plusieurs disques sur un même volume, ou de plusieurs volumes

Le système de fichiers qui part du dossier racine s’appelle le système de fichiers racine. Unix autorise chaque disque à avoir sa propre racine. Pour que le système de fichiers d’un disque supplémentaire puisse être utilisé, il faut le rendre accessible à Unix. Pour cela, on en fait un sous- arbre du système racine. Tout fichier du système que l’on a ainsi “ monté ” – mounted – sera désormais accessible par un chemin partant de la racine du système racine. On peut en sens inverse

“ démonter ” un système de fichiers. Les montages/démontages se font à l’aide de commandes Unix auxquelles seul l’administrateur du système à accès.

Avant montage Après montage

/

user temp usr

/

année1 année2 année3

/

users

temp usr

année1 année2 année3

4. Le matériel dont dispose l’ENSI de Caen

Les machines principales de l’ENSI sont des Sun Entreprise dont les noms sont e450 et e3000.

Ce sont les “ serveurs ” de l’école. Ils fournissent la puissance de calcul, la mémoire, les disques, le Web, le courrier… Leur système d’exploitation est une variante d’Unix : Solaris. Les étudiants se connectent normalement à ces machines par des terminaux X-Window : tx1, tx2, tx3, etc.

Chaque session X-Window permet d’ouvrir plusieurs fenêtre Unix sur son bureau : une ou plusieurs consoles ou terminaux virtuels. Les PC : pc1, pc2, pc3 peuvent aussi utiliser à distance les serveurs Unix en simulant – ou “ émulant ” transcription de l’anglais emulate – un bureau X- Window.

4.1. Exemples de noms des périphériques utilisés

Les périphériques peuvent varier d’un système à l’autre. Quelques exemples :

Nom Description

/dev/lp imprimante principale /dev/dsk/0s0 disque système /dev/dsk/1s0 autre disque

/dev/null fichier “ nul ” qui n’est relié à aucun périphérique. On l’utilise pour rediriger des sorties qu’on ne veut pas voir apparaître à l’écran par exemple.

Il est maintenant possible d’illustrer le fait que les fichiers d’E/S sont considérés comme des fichiers ordinaires. La commande Unix cp permet de copier un fichier dans un autre. Par exemple pour copier un fichier de nom essai dans un autre dont le nom est définitif

(7)

cp essai definitif

si l’on veut visualiser essai à l’écran, on peut écrire cp essai /dev/ttyc0

4.2. Quelques dossiers utilisés par Unix

Nom Description

/dev les périphériques d’entrées sorties

/bin commandes d’Unix. Le système peut contenir plusieurs dossiers bin à différents niveaux

/etc fichiers et programmes d’administration du système et tables /tmp fichiers temporaires

/lib bibliothèques

/usr dossiers de fichiers et de programmes système /usr/bin utilitaires

Dans le dossier principal de chaque utilisateur, un fichier .profile est exécuté à la connexion. Le fichier lance des commandes spécifiques pour chaque utilisateur telles que l’affectation de certaines valeurs aux variables du shell. Par exemple PS1 définit la valeur du caractère qui invite l’utilisateur à taper sa commande, le prompt, généralement >, #, ou $ . Il est modifiable par l’utilisateur, HOME définit le dossier principal de l’utilisateur. Ce même fichier est lancé avec chaque interprète de commande shell, par exemple quand on ouvre une nouvelle fenêtre.

4.3. Quelques commandes de gestion de dossiers et de fichiers

Commandes Options Description

mkdir <rep> suivi du nom d’un dossier, crée un dossier

mkdir /eleves/promo00/dupont/personnel Pour créer un site Web :

mkdir public_html

Tous les fichiers Web devront être dans ce dossier

rmdir <rep> suivi du nom d’un dossier, le supprime s’il est vide ; sinon renvoie un message d’erreur

rmdir /eleves/promo00/dupont/personnel pwd donne le chemin d’accès complet du dossier courant “ . ”.

$ pwd

/eleves/promo00/dupont/personnel cd fait revenir dans son dossier principal (home) cd <rep> change de dossier de travail courant

cd /eleves/promo00/dupont/projet cd public_html

(8)

ls donne la liste du contenu des dossiers. Nombreuses options dont -a qui affiche en plus les noms des fichiers invisibles – précédés

d’un “ . ”

-t qui liste dans l’ordre des dernières modifications -s qui donne en plus la taille des fichiers

-d qui donne la liste des sous dossiers

-l qui affiche plus de renseignements et notamment les protections existantes sur les fichiers.

ls -l /eleves/promo00/dupont

ll abréviation de ls -l

ll /eleves/promo00/dupont

cat commande de concaténation de fichiers.

cat fichier1 visualise sans pause le fichier fichier1 du dossier courant

cat f1 f2 f3 affiche le contenu de f1, puis de f2, puis de f3

more visualise un fichier page par page en tapant à chaque page la barre d’espace, ou ligne par ligne et tapant entrée; pour quitter, on tape le caractère q.

more fichier1

mv déplace ou renomme les fichiers

mv f1 f2 f3 dossier déplace f1, f2 et f3 dans dossier en gardant leur nom

mv f1 f2

change le nom de f1 en f2

Les fichiers et les dossiers sont désignés de manière relative ou absolue

cp duplique les fichiers

cp f1 f2 f3 dossier duplique f1, f2 et f3 dans dossier en gardant leur nom

cp f1 f2

duplique le fichier f1 en f2

rm supprime des fichiers

rm f1 f2 f3

-i option interactive. Supprime des fichiers en demandant une confirmation.

od -x

-c -d

donne le contenu binaire d’un fichier sous différents formats indiqués en option : hexadécimal, ascii, décimal, etc.

4.4. Impression de fichiers

Pour imprimer un fichier, on recommande d'utiliser la commande lpr de préférence à la commande standard lp.

(9)

Commande Description et exemples

lpr <fichier> sortie sur l'imprimante de la salle où l'on est connecté lpr f1 f2 f3

sortie séquentielle des 3 fichiers lpr f*

sortie des fichiers au nom commençant par f lpstat état du spool ; différentes options

lpstat -u

indique les n° des requêtes en attente d'impression

cancel <n° requête> arrête l'impression si elle est en cours, sinon supprime la requête de la file d'attente

4.5. Protection des dossiers et des fichiers

Il y a dans Unix un utilisateur privilégié, appelé super-utilisateur (super user) qui possède tous les droits. Il se connecte sous le compte root. Le système n’effectue aucun contrôle sur l’exécution de ses processus. Les autres utilisateurs se répartissent en trois niveaux :

1. le propriétaire du fichier

2. les membres du même groupe, par exemple les étudiants d’une même promotion 3. tous les autres utilisateurs.

Pour chacun de ces niveaux on distingue trois modes d’autorisation possibles :

· un droit de lecture (pour un dossier, droit de lister)

· un droit d’écriture (pour un dossier, droit d’ajouter ou de supprimer des fichiers)

· un droit d’exécution pour les fichiers exécutables (il faut ce droit pour se déplacer dans un dossier avec la commande cd)

Les droits s’abrègent en anglais : rwx – read, write execute. La commande ls -l permet de visualiser ces droits dans la colonne de gauche, respectant l’ordre décrit ci-dessus et les indications suivantes :

Caractère Description r si droit en lecture w si droit en écriture x si droit en exécution - si droit refusé

Ces droits sont précédés d'une indication sur la nature du fichier : Caractère Description

- Fichier ordinaire

d Dossier

c Périphérique caractère (fichier spécial) b Périphérique bloc

(fichier spécial)

(10)

et suivis :

· du nombre de liens sur ce fichier, c’est-à-dire du nombre de dossiers qui contiennent une référence au fichier

· du nom du propriétaire du fichier ou du dossier

· du nom du groupe auquel appartient le propriétaire

· de la taille en octets

· de la date de la dernière modification

· du nom du fichier.

Par exemple :

$ls -l

drwxr-x--- 2 dupont promo00 4509 Oct 24 1999 travail

indique qu’il s’agit d'un dossier ; tous droits sont donnés au propriétaire dupont. Seuls les droits de lecture et exécution sont donnés au groupe promo00 et rien aux autres utilisateurs.

Pour changer les droits d'accès à un fichier ou à un dossier on utilise la commande chmod avec la syntaxe suivante :

chmod qui opérateur droits fichier_ou_dossier

avec les paramètres qui, opérateur et droits décrit dans le tableau suivant.

Qui Description Opérateur Description Droits Description

u le propriétaire + un ajout de protection r Lecture

g le groupe - un retrait de protection w Écriture

o les autres utilisateurs = une affectation absolue x Exécution

a tous les utilisateurs s

s peut remplacer le droit x du propriétaire ou du groupe. Le programme s’exécute alors pour tout le monde avec les droits du propriétaire et/ou du groupe. Ceci n’a de sens que pour les fichiers exécutables.

Une autre façon d'utiliser chmod consiste à le faire suivre d'un entier composé de 3 chiffres, se référant dans l’ordre, au propriétaire, au groupe et aux autres. Chacun de ces chiffres est la somme de trois chiffres choisis parmi 4, pour la lecture, 2, pour l’écriture et 1, pour l’exécution. Ils correspondent à trois bits positionnant chacun des droits.

Chiffres décimaux Chiffres binaires Droits

0 000 pas d’accès

4 100 accès en lecture

2 010 accès en écriture

1 001 accès en exécution

Par exemple, le droit rwxr-xr-x correspond à 755 parce que rwx correspond à 4 +2 +1 = 7 (100 + 010 + 001) et r-x à 4 +0 +1 = 5 (100 + 001). La forme de la commande est :

(11)

$ chmod droits fichier_ou_dossier par exemple

$ chmod 755 public_html pour rendre son dossier Web accessible

$ cd public_html et

$ chmod 644 index.html

pour permettre aux utilisateurs de lire sa page Web

5. L’interprète de commandes – le shell

5.1. Possibilités du shell

Le shell, l’interprète de commandes d’Unix, est le programme le plus employé sur un système Unix standard. L’utilisateur est en liaison avec le shell dès l’ouverture d’une session de travail, et c’est lui qui en contrôle la conclusion.

Plusieurs shells ont été développés. Nous utilisons le shell de Korn ou Korn shell. Le shell permet :

· le traitement interactif

· le traitement en arrière-plan (background)

· la redirection des entrées/sorties

· l’utilisation de tubes permettant aux résultats d’un processus de servir immédiatement de données pour un autre processus

· d’écrire des procédures de commandes

· d’utiliser des variables dans ces procédures

· de l’utiliser comme langage de programmation de commandes. C’est un interprète de commandes programmable.

5.2. Syntaxe des commandes

L’invite ou le prompt est le signe que nous affiche le shell pour nous inviter à rentrer une commande dont il assurera l’exécution. Lorsque la ligne est envoyée, le shell l’examine et lance la commande Unix appropriée. Le nom du shell est ici ksh (korn-shell). Toutes les commandes transmises au shell respectent la même syntaxe :

· un nom qui indique quoi faire

· des options qui indiquent comment le faire

· un argument qui indique sur quoi le faire, en général un fichier.

Par exemple : ls -l perso

(12)

5.2.1. Entrées/sorties des commandes

Lorsque le shell traite une commande, il assigne au programme d’exécution de la commande trois fichiers standards qui sont affectés au terminal (clavier et écran) si l’on ne précise rien de plus :

· un fichier d’entrée standard dans lequel le programme lit ses données ; son nom est stdin

· un fichier de sortie standard dans lequel le programme écrit ses résultats ; son nom est stdout

· un fichier d’erreurs standard qui reçoit les messages d’erreur générés lors de l’exécution ; son nom est stderr.

Ces flux d’entrées-sorties peuvent être redirigés vers d’autres fichiers très simplement.

Voyons sur un exemple : soit un programme calcul à exécuter.

· les données étant entrées au clavier, et les résultats étant à afficher sur l’écran on tape la commande

$ calcul

· les données étant à lire dans le fichier calcul.e et les résultats à afficher à l’écran, on tape

$ calcul < calcul.e

· la sortie devant se faire dans calcul.s et les données étant entrées au clavier, on tape

$ calcul > calcul.s

· les données étant à lire dans calcul.e et les sorties à écrire dans calcul.s on tape

$ calcul < calcul.e > calcul.s

· les résultats devant être écrits à la suite de ce qui déjà écrit dans le fichier calcul.s on tape

$ calcul >> calcul.s

· Les erreurs peuvent être redirigées à l’aide du symbole 2>

$ calcul 2> fichier_erreur Donnons un exemple avec la commande cat :

· cat > f1 remplace ou crée f1 et écrit dedans ce que l’on tape ensuite au clavier

· cat > index.html crée le fichier de la page d’accueil d’un site Web

· cat >> f1 écrit dans f1 ce que l’on tape ensuite et le place à la suite de ce qui y figurait déjà

· cat f1 f2 > f3 concatène f1 et f2 et met l’ensemble dans un fichier nommé f3

5.2.2. Les tubes ou “ pipes ”

Généralement les utilitaires d’Unix ne sont prévus que pour accomplir une seule opération. Les tâches les plus complexes sont réalisées en faisant se succéder en séquence les commandes nécessaires à l’accomplissement de cette tâche.

Soient donc deux programmes premcal et derncal tels que les résultats du premier soient les données du second, on écrit :

$ premcal ½ derncal

(13)

ce qui équivaut à

$ premcal > résultat suivi de

$ derncal < résultat

On a ainsi réalisé un “ tube ”. On transmet ainsi directement la sortie standard d’une commande à une autre commande. Par exemple,

$ calcul ½ more

permet d’avoir l’affichage des résultats à l’écran page par page.

5.2.3. Les filtres

Un certain nombre de commandes d’Unix sont conçues pour accepter des données d’un seul fichier d’entrée, les traiter en les modifiant éventuellement, et envoyer les résultats à un seul fichier de sortie ; les procédures de ce type sont appelées des filtres. Par exemple

dd qui peut être utilisée pour prendre un fichier en majuscules et le transformer en un fichier en minuscules

tr qui prend un fichier et assure le transcodage de ses éléments (voir le manuel)

5.2.4. Exécutions conditionnelles de commandes

L’utilisation des opérateurs && (symbole “ et si ”) et ïï (symbole “ ou si ”) permet l’exécution conditionnelle de commandes enchaînées.

Commande Description

com1 ïï com2 si com1 a échoué, c’est à dire si son code de retour est non nul, alors com2 est exécutée

com1 && com2 com2 n’est exécutée que si com1 s’est effectuée correctement c’est à dire si son code de retour est nul.

5.2.5. Exécution d’un programme en arrière-plan (background)

Lorsqu’on lance une commande, le shell crée un nouveau processus et attend qu’il soit terminé pour redonner la main à l’utilisateur. Lorsque le temps d’exécution d’une commande est long (compilation, impression) on peut faire exécuter le programme en arrière-plan grâce à l’opérateur &. On reprend ainsi la main. La commande :

$ g++ prog.cc -o prog &

lance la compilation C++ de prog.cc et donne de suite la main à l’utilisateur, après avoir affiché le numéro d’identification de la tâche. La commande, g++ dans notre exemple, est alors exécutée en arrière-plan.

(14)

5.2.6. Quelques commandes utiles

Commande Opt. Description

man donne la description d’une commande.

man <commande>

date donne la date et l’heure

who indique le nom des utilisateurs présents

whoami donne le nom du compte sous lequel on travaille tty donne le nom du terminal sur lequel on travaille

wc compte le nombre de caractère, de mots, de lignes d’un fichier.

wc <fichier>

echo affiche le texte qui suit la commande.

ps donne l’état des processus actifs, options : -t pour les processus associés à un terminal donné -f format étendu

-e pour tous les processus non associés à un terminal donné kill envoi d’un signal à un processus et s’écrit

kill -n°signal n°processus Si n° signal est 9 le processus est tué.

Si n° signal est 3 le processus est quitté, donc terminé de force, par exemple

$ kill -9 1253

Les n° de processus sont donnés par la commande ps. Le n° d’un processus en arrière-plan est affiché dès que la commande suivie de & a été lancée

grep affiche les lignes d’un fichier qui contienne une certaine chaîne de caractères.

grep <chaîne> <fichier>

history donne la liste des dernières commandes tapées en les numérotant. On peut grâce à lui re-exécuter des commandes par l’instruction !<numéro de la commande>

sort trie les lignes d’un fichier par ordre alphabétique.

sort <fichier>

find recherche des fichiers dans une arborescence et en fonction de de paramètres qui pourront être donnés en arguments. Plusieurs options dont -name et -print

-name <nom du fichier que l'on recherche>

Le nom du fichier doit être entre apostrophes droites '…' s’il comporte un caractère spécial (par exemple le caractère *). En standard, l'option - print, même non précisée, est active. -print affiche le chemin d'accès du(es) fichier(s) trouvé(s)

find . -name 'e*.p' -print

Le “ . ” signifie que la recherche se fait à partir du dossier courant. Si on ne recherche que dans un dossier, il faut préciser son nom à la place du point

find travail -name 'e*.p' -print whereis affiche le chemin où se trouve un fichier

(15)

6. Communications sur le réseau Internet

6.1. Généralités

Les commandes de communication disponibles sur le réseau de l’ENSI de Caen reposent sur des protocoles d’interconnexion de réseaux (IP), et de transport de données (TCP), universellement adoptés dans les systèmes informatiques. On distingue les commandes proprement TCP/IP de celles qui ne sont implantées que sur les systèmes Unix.

6.2. Les commandes TCP/IP

Ces commandes ne sont pas liées à Unix et ont une syntaxe propre. Elles permettent de communiquer avec des systèmes d’exploitation hétérogènes, notamment, dans notre cas avec Windows et Unix.

Commande Description

mail permet d’adresser du courrier (des messages) aux utilisateurs d’un réseau. La syntaxe pour l’envoi est

mail utilisateur@adresse_distante par exemple

$ mail [email protected]

La commande est interactive. Elle vous demande un sujet sur une ligne, puis le corps de votre message. Vous terminez par une fin de fichier (^D sur Unix), ou par un “ . ” (un point).

Vous pouvez bien sûr composer votre message dans un fichier, puis le rediriger, par exemple

$ mail [email protected] < ficmail1

Si vous recevez du courrier, le système vous l’indiquera à la connexion par : You have mail

Vous pourrez lire ce courrier en tapant

$ mail

Les commandes courantes sont :

· l’affichage d’un message par un retour chariot

· la sauvegarde par s, elle se fera par défaut dans un fichier mbox (mailbox)

· la destruction par d

· l’aide par ?

telnet réalise une connexion distance en simulant un terminal. Telnet, une fois connecté, interprète des commandes de la même manière que le shell d’Unix.

Telnet dispose aussi de ses propres commandes. Les principales sont :

· la connexion par open machine_distante

· la fin de connexion par close

· l’aide par ?

netstat (network statistics) fournit des statistiques sur les communications dans le réseau, vu d’une machine locale. Les options sont nombreuses.

ruptime donne l’état du réseau en précisant les machines actives et le nombre d’utilisateurs connectés.

(16)

ftp File Transfer Protocol effectue le transfert de fichiers à travers un réseau. De la même manière que telnet, ftp a ses propres commandes qui servent à piloter le transfert. Celles-ci sont plus nombreuses et plus élaborées. Les principales sont :

· la connexion par open machine_distante

· la déconnexion par close

· On manipule l’arborescence distante par pwd, cd, dir, mkdir, rmdir, rename, delete

· On se déplace dans l’arborescence locale avec lcd

· On reçoit les fichiers par get fichier_lointain

· On les envoie par put fichier_local

· On réalise des transferts multiples avec mget et mput

· On positionne le transfert en mode binaire avec binary pour des images ou du code, ou texte avec ascii pour des fichiers contenant du texte sans formatage.

· On obtient de l’aide par help

· On quitte ftp par quit

6.3. Les commandes Unix à distance

Ces commandes on une syntaxe semblable à leurs homologues locales à ceci près qu’elles sont préfixées de la lettre “ r ” pour remote (éloigné).

Commande Description

rlogin commande de connexion à distance. Sa syntaxe est rlogin machine_distante

rcp effectue la copie de fichiers d’un système Unix à un autre. La syntaxe est rcp f1 f2 ou

rcp f1 … fn dossier

f1, f2 et dossier étant donnés par leur arborescence.

Si les fichiers sont distants, on fait précéder le nom du fichier par le nom de la machine suivi de “ : ” (deux points), par exemple

rcp machine1:f1 machine2:f2 rsh réalise une exécution à distance. Sa syntaxe est

rsh machine commande

7. Make et quelques autres outils

Make automatise la compilation séparée. C’est un outil élaboré et son maniement peut être complexe. Nous ne présentons qu’un exemple d’utilisation.

Dans le cadre d’un projet composé de trois fichiers, l’obtention d’un fichier exécutable se fait en compilant chacun des trois fichiers de façon à obtenir trois fichiers objets. Ensuite l’édition des liens avec des bibliothèques permet de construire l’exécutable. Si l’on modifie l’un des trois fichiers, on met à jour l’exécutable en recompilant le fichier modifié, puis en rééditant les liens. Make réalise automatiquement les mises à jour grâce à un fichier décrivant un graphe de dépendance. Il tient compte des dates de création des fichiers, et si celles-ci ne correspondent pas aux dépendances décrites, il exécute une commande de mise à jour.

(17)

Dans notre exemple, soient

Fichiers Description

fich1.c, fich2.c, fich3.c les fichiers source fich1.o, fich2.o, fich3.o les fichiers objets

const.h le fichier où sont rassemblées les constantes

prog le nom de l'exécutable

alors le fichier de nom makefile sera construit de la façon suivante :

prog: fich1.o fich2.o fich3.o # ligne 1 cc -o prog fich1.o fich2.o fich3.o # ligne 2

fich1.o: fich1.c const.h # ligne 3

cc -c fich1.c # ligne 4

fich2.o: fich2.c const.h # ligne 5

cc -c fich2.c # ligne 6

fich3.o: fich3.c const.h # ligne 7

cc -c fich3.c # ligne 8

À chacun des objets : prog, fich1.o, fich2.o et fich3.o correspond une ligne de dépendance (lignes 1, 3, 5 et 7 du fichier makefile). Une dépendance est rompue si la date de création du membre gauche est antérieure à l'une des dates de création du membre droit. La ligne de commande correspondante (lignes 2, 4, 6 ou 8) qui commence toujours par une tabulation est alors exécutée.

Dans notre exemple, la première ligne de commande (ligne 2) demande une édition de liens et création d'un exécutable (option -o), les trois autres (lignes 4, 6 et 8) demandent une création de fichiers objet (option -c).

La commande de mise à jour de compilation est lancée par

$ make

Si on garde le nom standard makefile au fichier ci-dessus. Sinon make doit être suivi de l’option -f suivie elle-même du nom choisi pour le fichier. Par exemple

$ make -f mon_fichier Quelques autres outils :

SCCS permet de gérer les différentes versions d'un programme.

lex est un analyseur lexical.

yacc est un compilateur de compilateurs.

8. La programmation du shell

8.1. Généralités

Il est courant de recourir sans cesse aux mêmes séquences de commandes. Elles peuvent être écrites dans un fichier de commandes que l’on appellera une procédure shell. Il y a alors possibilité de passer au shell le nom de cette procédure comme s’il s’agissait d’une commande. Dans une telle procédure les commentaires s’écrivent précédés du caractère #

(18)

Pour exécuter une procédure de commande on tape

$ sh fichier_commandes

On peut aussi lui attribuer un droit d’exécution (x), ce qui permet de lancer son exécution en tapant seulement le nom de la procédure de commandes. On la lance alors comme une commande shell.

$ fichier_commandes 8.2. Notion de variable shell

On peut rendre plus souples ces procédures en utilisant les variables du shell. Une variable du shell est un identificateur utilisé pour stocker une chaîne de caractères qui sera alors la valeur de cette variable. L’opérateur = permet d’affecter une valeur à une variable, cette valeur pouvant être la chaîne vide. Le contenu d’une variable est référencé par le nom de cette variable précédée du caractère $. Par exemple :

fichier=/eleves/promo00/dupont/projet

echo $fichier affiche le chemin

/eleves/promo00/dupont/projet more $fichier affiche le fichier page par page

Certaines variables sont prédéfinies et ont une signification particulière pour le shell. Elles sont toujours en majuscules :

Variables Description

LOGNAME nom de l’utilisateur

HOME contient le nom du dossier principal de l’utilisateur (son “ home directory ”) PATH liste des dossiers dans lesquels le shell doit rechercher le nom des commandes

données par l’utilisateur : c’est le “ chemin de recherche ”

Grâce aux chemins de recherche, les noms de programmes ne nécessitent pas une adresse complète.

PS1 chaîne de caractères utilisée par le shell pour solliciter l’introduction de la commande suivante. Cette chaîne constitue le “ prompt ” ($ en standard pour l’utilisateur, # en standard pour le superutilisateur). Il peut être défini dans le fichier .profile

PS2 caractère de continuation envoyé par le shell, > par défaut.

TERM type du terminal utilisé

MAIL nom du fichier boîte aux lettres de l’utilisateur

On peut affecter le résultat d’une commande, écrite sur sa sortie standard, dans une variable shell. Il suffit pour cela de placer de part et d’autre de la commande, le caractère “ ` ” (back quote). Par exemple :

$ ma_date=`date` stocke la date dans la variable ma_date

$ echo $ma_date

Tue Nov 30 15:30:04 MET 1999

Une variable est toujours locale à la procédure dans laquelle elle est définie. Pour qu’elle soit connue des autres procédures appelées, il faut “ l’exporter ” grâce à la directive export. Quand

(19)

une procédure de commande est appelée, les variables exportées sont recopiées dans le contexte de la procédure appelée. Toute modification effectuée sur ces variables à l’intérieur d’une procédure n’affecte pas la valeur de ces variables dans le contexte de la procédure appelante. Par exemple :

$ prog=essai

$ export prog

$ resultat

La commande export rend la variable prog disponible pour la procédure résultat et lui confère ainsi plus de généralité.

8.3. Quelques instructions pour écrire des procédures de commande Les instructions et structures de contrôle :

Instructions Description

echo affiche un caractère d’invite ou un message sur la sortie standard

read prend des valeurs dans le fichier d’entrée standard et les place dans les variables du shell

test contrôle l’exécution conditionnelle d’une procédure expr évalue une expression et donne sa valeur

true renvoie le booléen vrai false renvoie le booléen faux

wait attend la fin du traitement en arrière-plan ; permet de s’assurer qu’un traitement important est terminé avant de poursuivre l’exécution d’une procédure

sleep provoque l’interruption de l’exécution des commandes pour plusieurs secondes.

8.4. Les paramètres

Les paramètres sont les variables qui se réfèrent à la commande (premier paramètre) et à ses arguments (paramètres suivants). Lors de l’appel d’une procédure de commandes, il est possible de spécifier des paramètres qui seront transmis par valeur et désignés dans la procédure appelée par un numéro indiquant leur position dans la liste des paramètres. Par définition, le paramètre n° 0 correspond au nom de la commande.

Paramètres Description

$0, $1, …, $9 valeur des paramètres

$# nombre de paramètres passés dans l’appel

$* ensemble des paramètres sauf $0

$? valeur du code de retour de la dernière commande

$$ valeur du numéro du processus courant

$! valeur du numéro du dernier processus exécuté en arrière-plan

$- valeur des flags d’exécution du shell (positionnés par set, cf.

documentation fournie par la commande man sh)

La commande shift décale la numérotation des arguments vers la gauche tout en laissant $0 à la première place : $2 devient $1, $3 devient $2 etc. et $1 est devenu inaccessible.

(20)

8.5. Les structures de contrôle

Elles permettent d’exécuter conditionnellement une séquence de commandes.

8.5.1. Conditions

Certaines conditions peuvent être évaluées par test et des expressions logiques. La condition permet d’avoir des informations sur un fichier ou sur une chaîne de caractères. Soit un fichier de nom fi :

test -r fi vrai si fi existe et si l’utilisateur y possède un droit lecture test -w fi idem en écriture

test -x fi idem en exécution

test -s fi vrai si la taille de fi est supérieure à 0 test -d fi vrai si fi est un dossier

test -f fi vrai si le fi est un fichier ordinaire Soient deux chaînes de caractères ch1 et ch2

test -z ch1 vrai si ch1 est de taille nulle test -n ch1 vrai si ch1 est de taille non nulle test ch1 = ch2 vrai si les deux chaînes sont identiques test ch1 != ch2 vrai si les deux chaînes sont différentes test ch1 vrai si ch1 est une chaîne non nulle Soient deux entiers n1 et n2

Conditions Descriptions

test n1 -eq n2 vrai si n1 et n2 sont égaux test n1 -ne n2 vrai si n1 et n2 sont différents test n1 -gt n2 vrai si n1 > n2

test n1 -lt n2 vrai si n1 < n2 test n1 -ge n2 vrai si n1 >= n2 test n1 -le n2 vrai si n1 <= n2

Ces tests peuvent être combinés avec les opérateurs suivants : Op Description

! négation logique -a ET logique -o OU logique Exemple :

if test -r essai -a -s essai

qui vérifie l’existence, le droit de lecture et la taille non nulle du fichier essai.

(21)

8.5.2. La structure if … then … else La syntaxe est :

if expression_logique then liste_commandes else liste_commandes fi

où la liste de commandes est une suite de commandes séparées par le caractère “ ; ” et interprétées de gauche à droite. La valeur de l’expression retournée par le if est celle retournée par la dernière commande de la liste. Le else est facultatif.

Exemple: la création du fichier de commandes comparaison:

$ cat comparaison if test $1=$2

then echo $1 et $2 sont identiques else echo $1 et $2 sont différents fi

Exécution :

$ comparaison essai1 essai2

essai1 et essai2 sont différents

$ comparaison essai1 essai1

essai1 et essai1 sont identiques

8.5.3. Les structures itératives while et until La syntaxe est :

while expression_logique do

liste_commandes done

et

until expression_logique do

liste_commandes done

Le corps de la boucle est exécuté si la dernière commande de la première liste de commandes renvoie un code de retour nul pour la boucle while et non nul pour la boucle until.

(22)

8.5.4. L’itération for La syntaxe est :

for nom_variable in liste_mots do

liste_commandes done

À chaque exécution de la séquence, la variable pointe sur un mot de la liste de mots lorsque celle-ci existe. Si elle est omise, la séquence est exécutée pour chaque paramètre transmis.

Par exemple :

Programme Contenu du programme Exécution du programme

boucle1 v1=1 v2=2

for i in $v1 $v2 do

echo $i done

$ boucle1 essai1 essai2 essai3 essai1

essai2

boucle2 for i in do echo $i done

boucle2 essai1 essai2 essai3 essai1

essai2 essai3

8.5.5. Le branchement multiple

Il permet d’éviter trop de if imbriqués. La syntaxe est:

case mot in

modèle) liste_commandes;;

modèle) liste_commandes ;;

… esac

Si le mot correspond à un des modèles, les commandes associées sont exécutées. Si le mot correspond à plusieurs modèles, seul le premier dans la liste sera reconnu. Par exemple :

echo reponse?

read reponse case $reponse in

oui) echo reponse oui;;

non) echo reponse non;;

*) echo autres reponses;;

esac

Références

Documents relatifs

Une commande fort utile pour passer le résultat d’une commande comme argument de la commande suivante est xargs.. Ainsi, au lieu d’utiliser l’option -exec de find , nous pouvons

Le Bourne shell est introduit dans le syst` eme UNIX V7. Il a ´ et´ e d´ evelopp´ e par Stephen Bourne avec l’objectif de cr´ eer un outil de scriptage des commandes pour

• Les noms de fichiers possèdent souvent une extension qui permet d’identifier facilement le type de fichier dont il s’agit (par ex : .c pour un programme C, .f, .f77, .f90 pour

19.12 La commande d’interaction avec le shell sous “ vi ” Les accès au système Unix sous “ vi ” en Mode ligne Entrez en mode ligne par “ : ”. :r fichier Insertion du

, → Copie le fichier kern.log , situé dans le répertoire /var/log/ , vers le répertoire courant (chemin ./ ).. • Copie d’un répertoire avec l’option -r (pour recursive) : cp

• gedit nom_fichier =&gt; permet d'éditer un fichier avec l'éditeur gedit.. • grep mot nom_fichier =&gt; recherche le mot dans

(en particulier pour le C-Shell et le Bourne-Again-Shell) permet de rappeler une commande antérieure (il peut se trouver n'importe où dans la ligne), et la commande

Cliquez ici pour telecharger le