Introduction


Un système d'exploitation est un ensemble de programmes qui réalise l'interface entre le matériel de l'ordinateur et les utilisateurs.

Il défini sur la machine physique une machine virtuelle plus conviviale.

Il prend en charge la gestion des ressources pour en optimiser l'utilisation et en permettre le partage.


UNIX est

interactif multi-utilisateurs multi-taches

Langages de commandes les 10

Universalité d'UNIX sur l'ensemble du Matériel

Interfaces graphiques


Résumé:

Interactif ->exécution immédiate des commandes

Multi-Utilisateur-> identification de chaque utilisateur

Multi-Tache -> plusieurs traitements effectués en mÞme temps pour un mÞme utilisateur.

Universalité-> système très utilisé à travers le monde.

Langages de commandes évolués: sh,csh,ksh,tcsh ,...

qui offre la possibilité de réaliser aisément et rapidement des traitements complexes.


une session =

login

+ travail=

une suite de commandes shell

une commande shell=

une suite de chaines de caractères séparées par des <espaces> ou des <tab>


+ terminer la session par un logout.


Premiers Pas

Le system UNIX est multi-utilisateurs, pour des raisons d'organisation et de sécurité, chaque utilisateur est identifié sur la machine (logname), pour que cette indentification soit efficace elle est associée à un mot de passe (password).

Toute session de travail sur la machine (le système) commence donc par une opération de login .


SE LOGER


- se faire reconnaitre par le système

 identification (logname) = nom sous le quel vous Þtes connus sur le système pour lequel vous Þtes un utilisateur unique (les 6 premières lettres de votre nom de famille).

mot de passe (password) = un code d'accès pour proteger votre compte ( Le(s) enseignant de Travaux Pratique vous fourniront le mot de passe temporaire associé à votre logname).


SUR les Terminaux X: model XP23

Tester si le terminal est allumé (diode sur le coin en bas à gauche de l'écran, et diode sur le "grille pain") .

Déplacer la souris pour désactiver la protection d'écran.


Apparait une fenÞtre de selection ou gr×ce à la souris vous selectionnez le serveur sur le quel vous allez travailler.


Pour le stage machine :

Apparait une fenÞtre : rectangle blanc au milieu de l'écran.

Cette fenÞtre contient trois lignes :

La première indique le type et le nom de la machine cible .

Puis

login: <- entrer ici votre logname

passwd: <- entrer ici votre mot de passe qui n'apparait pas

(sécurité oblige , comme les cartes bleues ).

Si vous vous Þtes trompé de machine, l'envoi d'un Ctrl-C (^C)

permet de revenir à la fenÞtre de selection.



Sur les TX vous aurez en standard (à UMLV) trois fenÞtres contenant soit l'interpréteur ksh soit l'interpréteur csh (dialecte de shell), deux applications X xload, xclock, et un menu général accessible en "cliquant" en dehors de toute fenÞtre.


Pour travailler avec un des interpréteurs il vous faut sélectionner avec la souris la fenÞtre le contenant.

Prompt $ pour ksh, Prompt % pour csh.

[le prompt est une invite qu'affiche l'interpréteur pour vous signaler que vous pouvez demander l'exécution d'une commande]






Remarques IMPORTANTES:


Le système et les interpréteurs de commandes distinguent lettres minuscules et majuscules.


En mode "normal", l'entrée au clavier est bufferisée en ligne

aucun traitement n'est fait tant que vous n'avez pas validé la ligne par la touche de validation cituée à droite du clavier principal, en general <enter>, la plus grosse touche.


Caractères spéciaux:

désignés symboliquement par : <erase> <kill> <intr> <quit> <eof>


<erase> ^h ou del Annulation du dernier caractère

<kill> ^u Annulation de la ligne

<intr> ^c Interruption + <kill>

<quit> ^z Interruption + <kill>

<eof> ^d fin de fichier (end of file)


les notations ^D ou Ctrl-D signifient qu'il faut une fois la touche control Ctrl enfoncée frapper la touche d.


[la commande stty permet de modifier les caractères spéciaux]


TRAVAILLER

Demander l'exécution de commandes à l'interpréteur:


taper une commande puis la valider par <enter>

l'interpréteur lance alors les processus correpondants (éventuellement aucun)


Une COMMANDE forme générale:


liste de chaänes de caractères séparées par des espaces ou des tabulations


<chaine1> [<chaine2>...<chaineP>]


nom de la Paramètres éventuels

commande - arguments

- options (-lia +1000)


Exemples :

date

cal

who

who<espace>am<espace> i

id


Un Processus exécutant un SHELL est associé au terminal sur lequel vous Þtes connecté (ou à une fenÞtre sur ce terminal). Ce processus prend comme données ce que vous tapez au clavier et génère comme sorties des affichages sur l'écran du terminal.


TERMINER!! SA SESSION DE TRAVAIL !


Sur un terminal X.

il faut détruire l'interpréteur shell de la fenÞtre "console"

Pour cela plusieurs posibilités :

- Soit taper la commande exit dans le shell.

- Soit détruire la fenÞtre "console" :

sélectionner l'option "close" du menu de la fenÞtre

ou utiliser le racourci clavier <Alt>-<F4>

[les racourcis clavier sont indiqués dans les menus des fenÞtres]

le menu général du terminal propose parfois un choix "fin de session" qui a le mÞme effet.

une fenÞtre de login ou de selection doit réapparaitre.



ATTENTION:


ne pas éteindre le Terminal

ceci ne déloge pas en général !

de plus les terminaux X sont très long à s'initialiser.



Quelques commandes


date date et heure courante

cal Calendrier de l'année

who liste des utilisateurs connectés

who am i Qui suis-je ?

id numéro personnel, numéro de groupe



mail <liste_d'utilisateurs>

Pour envoyer du courrier aux différents utilisateurs de la liste


echo <liste_d'arguments>


finger , passwd -f 


tty Nom "complet" du terminal


stty outil de manipulation des paramètres de la liaison terminal-ordinateur

avec l'option -a affiche les valeurs des paramètres de la liaison en particulier la valeur des caractères speciaux:

<erase> <kill> <intr> <quit> <eof>


stty sane rétablit la ligne dans un état "sain"


passwd pour définir ou changer un mot de passe


write <utilisateur> [<terminal>]

communication en temps réel avec un utilisateur logé

envoie tout ce qui est tapé sur le terminal de l'utilisateur désigné.


mesg [n|y] refuse ou autorise la réception de messages write.


Les fenÞtres




Les fenÞtres ont deux formats fixes : iconifié et Plein écran, et une taille variable définie par manipulation des barres de déplacement et de redimentionnement.

Les opérateurs Minimize Maximize et Restore permettent de passer d'un format à un autre :





Les fichiers et le système de fichiers


L'approche UNIX du système de gestion de fichiers et des entrées sorties est basée sur la simplicité. C'est pourquoi

- les fichiers ne sont pas structurés;

- les fichiers sont utilisables avec un point de vue très générique

(approche objet, il n'est pas nécessaire de connaätre la mise en oeuvre d'un disque dur pour pouvoir utiliser un fichier);

- les fichiers sont un standard de fait pour la communication entre processus;

- les fichiers forment aussi le modèle utilisé pour toutes les entrées sortie de processus sur le système.


Pour l'utilisateurs courrant :

un fichier UNIX est une suite d'octets (byte).


L'interprétation et la structure sont laissées aux applications utilisant le fichier.


Pour le système, un fichier peut Þtre un objet matériel (une imprimante) une collection de blocks sur disque, une zone de la mémoire, un écran etc...

L'utilisateur pourra utiliser avec les mÞmes commandes ces différentes possibilités le système ayant la t×che d'adapter les opérations réelles au médium cible.




Pour le système :

Les disques physiques sont partitionnés en disques logiques.


Un disque logique particulier : le disque système

c'est sur celui-ci que se trouve le système , le noyau et l'ensemble des commandes standard d'UNIX, c'est sur celui-ci que la machine trouve les informations pour booter (initialisation de la machine).


un fichier est référencé par un couple d'entiers:

- numéro du disque logique

- numéro d'inode dans le disque logique


Une inode est une structure contenant des informations sur le fichier

en particulier :

- taille

- propriétaire

- droits d'accès

- dates de modification, lecture , création

- l'adresse sur disque du fichier.


Pour les utilisateurs:

les disques logiques ne sont pas visibles, les disques sont perÛus comme une arborescence de fichiers et de fichiers spéciaux les répertoires.


MECANISME DE REFERENCAGE DES FICHIERS


L'arborescence UNIX.


Système hiérarchique de gestion de fichiers


Arborescence de racine

La Racine globale est celle du disque système

les Arcs sont valués par des chaines (références)

les Noeuds sont valués par des entiers (numéro d'inode)


Pour tout fichier de l'arborescence, il existe au moins un chemin du noeud correspondant au fichier à la racine globale.


* REFERENCE ABSOLUE D'UN FICHIER

/ch1/ch2/.../chn

valuations successives des arcs depuis la racine vers le fichier



A tout instant, un processus repère un répertoire particulier :

Le REPERTOIRE DE TRAVAIL

Possibilité de référence relative par rapport au répertoire de travail /ch1

ch2/.../chn

valuations successives des arcs d'un chemin du répertoire de travail au fichier à designer


IMPORTANT Tout répertoire contient (dès sa création) deux références particulières :

. pour se désigner lui-mÞme

.. pour désigner le répertoire père



Sur la figure suivante, on trouve une partie de l'arborescence typique

d'un système UNIX : la racine de l'arbre est le répertoire "/" (de numéro d'inode 2 dans le disque système).

On y trouve les répertoires importants du système :

- /etc répertoire d'administration du système

- /bin répertoire des commandes généralles

- /tmp répertoire des fichier temporaires

- /dev répertoire des fichiers "physiques" (devices)

- /users répertoires des utilisateurs

- /users/licence répertoires personels des utilisateurs du groupe licence







Nous venons d'utiliser des références absolues, pour noms des répertoires dans notre arborescence.

Une référence absolue commence par "/" la racine .

Puis on indique la suite des répertoires dans lesquels il faut descendre pour atteindre le répertoire ou le fichier voulu.


Par exemple : /users/staff/dr/James est un fichier

/users/licence est un répertoire.


Pour accéder au fichier James :

- le système regarde l'adresse du répertoire users dans le répertoire / puis dans ce répertoire /users il cherche l'adresse du répertoire staff, dans ce répertoire /users/staff il cherche la référence du répertoire dr dans lequel il trouve l'adresse du fichier James.


Comme on le voit, ce système de référence absolu est un peu lourd quant à son utilisation.

Pour simplifier et accélérer l'accès aux fichiers, on utilise les références relatives. Pour définir les références relatives, il faut introduire la notion de répertoire de travail.


Le répertoire de travail est simplement un répertoire auquel on accède par la référence "." et de faÛon imagée le lieu ou l'on "se trouve" dans l'arborescence. Tout processus a un répertoire de travail. Si une référence ne commence pas par "/" la recherche de la référence se fera à partir de ce répertoire de travail.


Quelques exemples sur le répertoire de travail et les références absolues et relatives.

Prenons notre utilisateur dr, et supposons que son répertoire de travail soit /users/staff/dr. Dans ce cas pour accéder au fichier James il lui suffira d'écrire simplement James.

Exemple :

La commande more fichier permet d'afficher le contenu du fichier.

Si le répertoire de travail est /users/staff/dr les deux commandes suivantes sont équivalentes :

more James

more /users/staff/dr/James


Un autre exemple en utilisant la référence ".." (répertoire père du répertoire courrant, tout répertoire contient les références "." pour lui et ".." pour son père ).


Supposons maintenant que le répertoire de travail soit

/users/staff/zip

pour afficher le fichier James la commande

more /users/staff/dr/James

est toujours valable car la référence absolue est indépendante du répertoire de travail.

Par contre, la référence relative de James par rapport au répertoire de travail est ../dr/James on écrira donc

more ../dr/James pour afficher le fichier James



Le répertoire de travail d'un utilisateur après la procédure de login est son répertoire personnel qui est indiqué dans la base de données /etc/passwd.



Quelques commandes pour se déplacer dans l'arborescence et pour inspecter le contenu des répertoires.


La commande pwd (print working directory) permet de faire afficher le répertoire de travail.


La commande cd référence permet de définir la référence donnée en paramètre comme le nouveau répertoire de travail du shell. Sans argument le répertoire personnel de l'utilisateur devient le répertoire de travail.

Cette commande permet de "se déplacer" dans l'arborescence.

% pwd

/users/staff/dr

% cd ..

% pwd

/users/staff

% cd ..

% pwd

% /users

% cd

% pwd

/users/staff/dr


La commande ls permet d'afficher le contenu d'un répertoire, sans options elle affiche le nom des fichiers du répertoire de travail ne commencant pas par "."

% ls

cat1 fich1 fich2 fich3

% ls -a # avec les fichiers commencant par .

. .. cat1 fich1 fich2 fich3

%

On retrouve les deux références obligatoires . et .. qui permettent de connaitre la position sur disque du répertoire et de son père.

LES TYPES DE FICHIERS


Les répertoires


Les fichiers ordinaires

Résultats de programmes

(éditeurs de textes, compilateurs, éditeurs de liens, fichiers résultats, ...)


Les fichiers spéciaux --> répertoire /dev

Associés aux ressources physiques auxquels sont associées des controleurs responsables de la communication

.disque(s)

.bande(s) magnétique(s)

.lecteur(s) de disquette

.terminaux, lignes de communication

.imprimantes


-->mode caractère [terminaux]

-->mode blocs [disque]



DROITS D'ACCES A UN FICHIER


Le système UNIX utilise un mécanisme de droits organisé par utilisateur et par groupe (la définition des groupes est laissée à l'administrateur système). Ainsi chaque objet de l'arborescence à un propriétaire et un groupe propriétaire.

Les droits d'accès sont définis pour trois types d'utilisateurs:

- le propriétaire

- les utilisateurs du groupe propriétaire

- les autres utilisateurs


Un fichier :

3 catégories d'utilisateurs

.propriétaire

.membres d'un groupe propriétaire

.les autres

3 types d'accès

.lecture

.écriture

.exécution

9 BITS DE PROTECTION

propriétaire groupe autres

- - - - - - - - -

r w x r w x r w x

r : lecture ; w : écriture ; x : exécution


La commande ls permet de connaitre les droits d'accès au fichiers et répertoires :


ls -l liste longue

type_droits nbr_de_liens user grp taille date_de_création nom

% ls -l

total 74

drwxrwxrwx 2 dr staff 24 Jul 16 10:32 cat1

-rw-rw-rw- 1 dr staff 0 Jul 16 10:28 fich1

-rw-rw-rw- 1 dr staff 35425 Jul 16 10:29 fich3


ls [-x] : liste des noms de fichiers (ne commenÛant pas par .) contenus dans le répertoire


ls -a : liste de tous les noms


ls -i : liste des noms avec leur numéro d'inode (d'index sur disque)


ls -R : liste récursive (exploration de tous les sous-répertoires).


ls -p : liste avec / après les noms de répertoires(et d'autre codes)


ls -b : liste oò les caractères "invisibles" sont imprimés sous la forme \ooo (code ASCII en octal)


ls -q : idem mais les caractères "invisibles" apparaisent sous la forme ?



Résumé :

Les fichiers ne sont pas structurés : uniquement une suite d'octets.

les applications définissent elles mÞme la structure du fichier.


Les fichiers sont référencés pour le système par des structures: les inodes, la référence réelle d'un fichier est son numéro d'inode.


Les fichiers sont organisés pour les utilisateurs dans une arborescence oò certains fichiers nommés répertoires permettant de connaätre le nom et l'adresse d'autres fichiers, cette arborescence a pour racine le répertoire de nom / (inode 2).


Tout processus admet un répertoire dit de travail.

Les processus (shell, commandes shell, et autres) utiliseront par défaut ce répertoire quand un accès fichier sera effectué avec une référence relative.


Une référence de fichier :

la suite des répertoires qu'il faut emprunter pour accéder au fichier, suivie du nom du fichier.


On parle de deux types de références pour un fichier :

- référence absolue: définie en partant de la racine / .

ex: /users/stage/bob

- référence relative: par rapport au répertoire de travail.

ex: dans le répertoire précédent

../bill/exo1



Quelques Commandes UNIX suite

cd réf le répertoire de travail devient le répertoire réf

cd le catalogue de travail devient le catalogue privé

pwd afficher le catalogue de travail

ls liste des réferences contenues dans un répertoire

options: -liapbR


cp fic1 fic2 copie physique de fichier

mv fic1 fic2 déplacement de fichier (changement de référence)

ln fic1 fic creation d'un lien (d'une référence)

rm référence destruction d'un lien (d'une référence)

cat fic envoi sur la sortie standard du contenu d'un fichier


who am i qui suis je

mail dr <fiche envoi du fichier fiche à l'utilisateur dr

write utilisateur envoyer un message sur l'écran de utilisateur

mesg [y|n] autorisation de réception des messages envoyés gr×ce à write.


stty -a paramètres régissant la liaison entre le terminal et l'ordinateur

stty erase <char> positionner le caractère spécial <erase>


Changement des attributs d'un fichier référence:

chown user référence changement de propriétaire

chgrp grp référence changement de groupe propriétaire

chmod modes référence changement des droit d'accès au fichier

Les processus


programme: "objet inerte", listes d'instructions

(éventuellement en binaire)


processus : "objet vivant" changeant au cours de son existance (de sa naissance à sa mort), qui correspond à l'execution d'un binaire.


A un instant donné, différents processus sont "vivants" sur le système.


des Processus système:

swapper

init

les démons

getty, biod,lpsched,nfsd,inetd

des processus utilisateur



Quelques caractéristiques des processus


un propriétaire

un numero identificateur [PID]

un processus père [PPID]


La commande ps permet d'obtenir des informations sur les processus existants.


La commande ps


ps liste des processus ayant été lancés par l'utilisateur depuis un terminal quelconque

ps -u liste de numeros d'identifications,

par exemple ps -u 0,dr,512 donne la liste de processus dont le propriétaire est un de ceux énumérés

ps -e tous les processus

ps -a tous les processus utilisateurs (i.e. non-système)

ps -l liste (l)ongue des informations




[F/S/UID/PID/PPID/C/PRI/NICE/ADDR/SZ/WCHAN/TTY/

TIME/CMD]

F/S etat

UID numéro du propriétaire réel

PID numéro du processus (identificateur)

PPID identificateur du processus pÞre

C etat pour le scheduler

NI priorité (grand nombre petite priorité)

Addr adresse en mémoire ou

adresse sur disque.

SZ taille en blocs de l'image mémoire

WCHAN événement en attente

TTY terminal de lancement

TIME temps cumulé d'execution

CMD commande exécutée

PRI priorité


Mécanisme general de fonctionnement des languages de commandes (shell)


pour chaque commande deux cas de figure:


1 création d'un processus

pour les commandes externes

le nom de la commande correspond à une entrée dans un répertoire d'une liste particulière (le PATH)

par exemple /bin/ls


2 pas de création de processus

pour les commandes internes au shell

le code réalisant la commande est contenu

dans l'interpréteur mesg.




en cas de création :

1) le processus shell est recopié (appel système fork)

2) l'un des deux processus est recouvert par

un nouveau contexte (programme/données)

gr×ce au mécanisme de recouvrement (appel exec)

3) le processus s'exécute pendant que le shell attend sa terminaison avant de lire de nouvelles commandes.




Interruption d'un processus lancé depuis un terminal


<intr> => interruption

<quit> => interruption avec sauvegarde de l'image

mémoire du processus dans un

fichier de référence core dans

le répertoire de travail


XON/XOFF: ^S/^Q

permettent d'arréter et faire reprendre le

défilement sur l'écran.



Les fichiers standards d'un processus


A tous processus est associé deux fichiers:

- l'entré standard

- la sortie standard





Les commandes standard unix/system V ont 3 fichiers standards


entrée standard :les données y sont lues

sortie standard : les resultats y sont écrits

sortie erreur standard : les "messages d'erreur" y sont écrits


Par défaut (exemple: sh), le fichier associé à chacun est le terminal de l'utilisateur .


Mécanismes de redirection


Un des atouts d'UNIX est la possibilité associer aux fichiers standards d'un processus d'autres fichiers que le fichier spécial qu'est le terminal de l'utilisateur.


commande > référence

redirection de la sortie standard avec écrasement du fichier

who >présents

sauvegarde de la liste des personnes logées


commande 2> référence

redirection de la sortie erreur standard avec écrasement


commande >> référence

redirection de la sortie standard sans écrasement

who >> présents

on ajoute la nouvelle liste à la fin du fichier présents


commande < référence

redirection de l'entrée standard

wc -l < présents

compte le nombre de ligne du fichier présents


exemples:

cat <fic1 >fic2 équivalent à cp fic1 fic2


dans votre fichier .profile les lignes

tail -1 .logdate

date >>.logdate

entrainent l'affichage de la date du dernier login et

ajoutent, à chaque login, l'heure et la date dans le fichier .logdate


Enchainement des processus


; opérateur de séquentialisation


date; who; ps


le processus shell

- lance la commande date

- attend la fin de la commande date

- lance la commande who

- attend la fin de la commande who

- lance la commande ps

à la fin de la commande ps retourne le prompt.



les trois processus correspondant aux commandes date,who,ps n'ont pas d'existence simultanée pour le système.


date;who >/tmp/fic

seule la sortie de who est redirigée


{date;who} >/tmp/fic

(date;who) >/tmp/fic

les deux sorties sont redirigées


exemple:

{date ; who | wc -l } >/tmp/fichier


Comment réaliser une commande qui affiche le nombre d'utilisateurs logés (un utilisateur logé plusieurs fois est compté plusieurs fois)



solution:


who >/tmp/who$$

wc -l < /tmp/who$$

rm /tmp/who$$ (le ménage ...)




Une solution plus "naturelle" sous UNIX est d'utiliser un opérateur qui permet de relier les entrées et sorties de processus gr×ce à des tubes.


LES TUBES (PIPE)


lancement concurrent de processus communiquant par un tube


who | wc -l


création d'un tube et lancement des deux processus who et wc


avec la sortie standard de who redirigée sur le tube

et l'entrée standard de wc redirigée sur le tube.


=> mécanisme général de filtrage

=> aspect multi-taches


Le problème d'un fichier temporaire trop grand pour la machine est résolu par ce mécanisme.

Les processus détachés (en tache de fond)



commande &

le shell créé un nouveau processus qui exécute la commande

mais n'attend pas la terminaison de ce processus

il est donc détaché du shell



pour interrompre les processus détachés, il faut leur envoyer un signal gr×ce à la commande kill .


kill -#signal PID


SIGINT 1 comme le caractère <intr>

SIGQUIT 2 comme le caractère <quit>


SIGKILL 9 qui tue surement et brutalement le processus.


ou utiliser les commandes de contrîle de t×ches.












Les Langages de commandes

Les SHELL


Interface entre les utilisateurs et le système

Sélection de son shell par la commande chsh <logname> <shell>


les shells des HPs


/bin/sh les Bourne Shell (standard "universel")

/bin/rsh shell restreint (utilisé pour les accès extérieurs)

/bin/csh C like shell (Berkeley)

/bin/ksh Korn shell (devient le standard POSIX)


L'une des forces d'UNIX est que le shell est une application comme les autres sans aucune propriété spécial, (d'autre applications sont parfois lancées au login).


Les shells offrent les mécanismes :

- d'expansion de noms (*,?,[],¼)

- de substitution et d'alias

- de redirection, pipe et lancement en tache de fond

- de lancement des commandes

(recherche de l'exécutable automatique)


Un langage de programmation évolué avec

variables

structures de contrîle

procédures (et fonctions )

transmission de paramètres

gestion d'interruptions

Un des plus gros atout est de pouvoir écrire de nouveau outils :


des fichiers de commandes "shell script"

dont l'exécution peut Þtre lancée de la mÞme faÛons que les commandes standards.



Enfin toute commande UNIX a un code de retour "exit status" qui permet de signaler si elle s'est déroulée normalement ou non.


Les shells pourrons gr×ce à leurs instructions conditionnelles utiliser ces codes.


La convention (attention c'est l'inverse du C) est :


si le code de retour est


nul: le déroulement est normal


Non nul : déroulement anormal


ce qui nous donne pour valeur de vérité


nul == Vrai

Non nul == Faux.


[0== pas d'erreur , sinon numéro de la cause du déroulement anormal]


Le Korn Shell


Nous allons étudier le Korn shell essentiellement dans le but d'écrire des scripts pour lancer l'exécution d'un fichier de commande ksh,


Quatre solutions pour exécuter un fichier de commande com :

1) Rendre le fichier exécutable par la commande chmod


prompt ksh -> $ com


il y a dans ce cas création d'un processus shell lisant ses données (des commandes) dans le fichier com.


Attention: ceci impose que le fichier soit lisible, en plus d'exécutable.

De plus le Korn shell n'est pas le shell standard mais celui de la norme POSIX, par défaut un fichier de commande est considéré comme étant écrit en Bourne shell, les fichiers de commande devrons donc commancer par la ligne #!/bin/ksh.


2) Lancer un processus sh avec un paramètre :


$ sh com

Création d'un processus shell com doit Þtre lisible seulement.


3) Utiliser le shell courant pour réaliser la commande en redirigeant l'entrée du shell courant sur le fichier gr×ce à la commande interne "." du shell:

$ . com

(le fichier doit toujours Þtre lisible)


4) en recouvrant le shell :

$ exec com

attention ceci détruit le shell courant (exécution /lecture).


LANCEMENT DU SHELL (INVOCATION)

Le Korn shell au login exécute le fichier .profile de votre catalogue privé. ($HOME/.profile )

Utilisez ce fichier pour :

- initialiser des variables : PATH,TERM,PS1 etc ...

- executer des commandes particulières : mesg n

-paramèttrer la ligne : stty erase ÃH

De plus si vous avez positioné la variable ENV avec une référence de fichier ce fichier sera aussi exécuté par le ksh. Souvant utilisé pour les alias et les définitions de fonctions.


Au lancement du shell :

si $0 commance par le caractère - c'est un shell de login.


Les options :

-c chaine lecture des commande dans la chaine

-i shell interactif

-r shell restreint (permet d'offrire un accès réduit a votre machine).



Le mécanisme d'expantion de noms


On vas au moyen de caractères spéciaux désigner des ensembles de références, (on parle d'expressions rationnelles).


Un mot contenant un de ces caractères spéciaux d'expentions sera remplacé par la liste triée des noms de fichiers reconnus par l'expression.


les caractères spéciaux du mécanisme d'expention sont :

? remplace un caractère quelquonque

* peut remplacer par n'importe quelle chaäne mÞme vide

[€sauf si cela crée une référence commancant par "." ]

[....] un des caractères de l'ensemble

[c1-c2] un des caractères de l'interval de c1 à C2 compris.


~ subsitué par la valeur de HOME

~user subistué par la valeur de HOME décrite dans /etc/passwd pour l'utilisateur user

~+ valeur de PWD et ~- de OLDPWD

Le Korn shell permet en plus de travailler avec des listes de motifs séparés par le caractère | et accèpte les expressions suivantes:


Patterns

?(liste-motifs) reconnait optionellement un des motifs.


*(liste-motifs) reconnait zéro ou plusieurs occurences des ¹ motifs.


+(liste-motifs) reconnait une ou plusieurs occurences des ¹ motifs.


@(liste-motifs) reconnait exactement un des motifs.


!(liste-motifs) reconnait tout sauf un des motifs donnés.

Mécanisme interne du shell


==============================

le shell travaille en deux étapes


1) analyse et expantion de nom de la commande

2) execution de la commande ainsi transformée


==============================


Il faut faire attention à cet aspect double du traitement d'une commande il peut amener le programmeur inatentif a de penibles déboires.


exemple avec l'expantion des variables:


# la variable A n'est pas déclarée

B=toto

if test $A -eq $B

then

echo egaux

fi


La ligne contenant le test est transformée en

if test -eq toto

qui n'est pas syntaxiquement correcte !


La famille des "guillemets" 'quotes' et Áanti-quotesÁ


" : subsitutions réalisées permet de former un seul paramètre d'appel avec les valeurs de plusieurs variables


' : subsitutions non réalisées permet d'afficher quelques $$


Á: subsitution réalisées,

Attention ce qui est entre Á est considérer comme une commande shell est evalue et le résultat est subsitué à la chaäne entre Á.


Autre écriture possible des anti-quotes :

$(commande)



exercices : créer un fichier comme suit et expliquer le resultat

#!/bin/ksh

echo ls * $*

echo "ls * $*"

echo 'ls * $*'

echo `ls * $*`


Les variables du Korn shell


Affectation nom=valeur (sans espaces)


nom = une chaäne de caractères commancant par une lettre

valeur =une chaine ou une valeur numérique.


Accès au variables


$nom est substitué dans la ligne de commande par la valeur de la variable nom.


echo $LOGNAME -> transformé en echo dr puis exécuté.


Le shell travail encore en deux étapes :

1) substitution de toutes les variables par leurs valeurs

2) execution de la commande


en cas de d'ambiguité on délimite l'identifieur par des accolades


${nom}


les tableaux


set -A tab a b c d e f g h i j k l

echo $tab[3]

d

echo $tab[(($#tab[*]-1))]

l


variables standards positionées automatiquement par le ksh


# le nombre d'arguments positionels en décimal

- options du shell et options positionnées par set

? Valeur de retour de la dernière commande en décimal.

$ le numéro de processus du shell

! le numéro de processus de la dernière commande détachée.

COLUMNS Largeur de la fenÞtre (mise à jours automatique sous X).

ERRNO Valeur de errno du dernier echec d'un appel système.

LINENO Numéro de ligne dans le script en cours d'exécution.

LINES Hauteur de la fenÞtre (mise à jours automatique sous X).

OLDPWD Précédent répertoire de travail.

OPTARG Valeur de la dernière option manipulée par getops

OPTIND Index de la dernière option manipulée par getops

PPID Numéro du processus père du shell

PWD Répertoire courrant

RANDOM Générateur aléatoire 0 à 32767. Initialisable en positionant RANDOM avec une valeur numérique.

REPLY Positionnée par select avec un read sans argument.

SECONDS Nombre de secondes depuis le début du shell positionable.

PS1= valeur du prompt 1 "$ "

PS2= valeur du prompt 2 "> "

HOME votre catalogue privé

LOGNAME votre nom de login

PATH liste des répertoires dans lesquels sont recherchées les commandes externes.

TERM type du terminal (important sur vt320 il faut spécifier vt100)

Mécanisme de substitution


${#parameter} Si parameter est * ou @, le nombre de paramètre est substitué. Sinon la longueur du paramètre est substitué.

${#identifier[*]} Le nombre d'éléments dans le tableau est substitué.

${parameter:-mot} Si parameter existe et est non-nul, sa valeur est substitué sinon mot est substitué.

${parameter:=mot} Si le paramètre n'est pas positioné ou nul lui affecté mot, substitué sa valeur. (les paramètres de position ne sont pas affectable ainsi).

${parameter:?mot} Si parameter existe et est non-nul, sa valeur est substitué sinon mot est affiché et le shell se termine, si mot est oublier un message standard est utilisé.

${parameter:+word} Si parameter existe et est non-nul,mot est substitué; sinon rien est substitué.

Le mot n'est évalue que si il est utilisé comme chaine de substitution. Dans l'exemple suivant la command pwd n'est exécuté que si la variable d n'est pas positioné ou est nulle:


echo ${d:-$(pwd)}

Dans ce cas si le (:) et omit seule l'existance de d est testée.



Listes de Variables définies dans le sh courant


set


suppresion d'un variable


unset nom ¼


transmission de variables aux processus fils :


liste des variables transmises


env


export nom

permet de transmetre la variable nom aux procesus créés par le shell gràce à l'environement des processus UNIX.


variable protégées (lecture seule)


readonly nom


Lecture d'un variable sur l'entrée standard


read nom


Attention les variables du shell peuvent contenir plusieurs chaänes séparées par des <espace>


Les variables paramètre des fichiers de commandes


Quand on appel un fichier de commande shell on peut utiliser des paramètres d'appels.


Pour manipuler ces paramètre d'appels on dispose des vaiables

0 à 9 , *, @ et des opérateurs shift et set .


les variables $1 $2 ... $9 désigne les 9 premiers paramètres d'appel


$* est équivalent à "$1 $2 ¼" i.e. tous les paramètres d'appel

$@ est équivalent à "$1" "$2" ¼


$0 nom d'appel du script (ou de la fonction)


shift permet de renuméroté les paramètres d'appel

$2 devient $1 etc ¼

le premier paramètre est perdu !


set permet de positionner la valeur des paramètres d'appel.


Les variables suivantes sont utilisées par le shell

CDPATH répertoire de recherche pour la commande cd

ENV référence du fichier d'initialisation essentiellement utilisé pour desfinir des alias et des fonctions.

HOME argument par defaut de la commande cd

PATH Répertoires de recherche des commandes.

PS1 Prompt principal, la valeur de cette varaible est évalue avant affichage, sa valeur par défaut est "$ " Un caractère ! y est substituer par le numéro de la commande. (pour entrer un ! placer !!)

PS2 Prompt secondaire par défaut "> ".

PS3 Prompt de la boucle select par defaut "#? ".

PS4 Prompt du mode trace (évaluation avant affichage), par defaut "+€".

SHELL Référence absolu du shell.

TMOUT Si cette variable est positionnée avec un valeur strictement positive , le shell se termine au bout de ce nombre de second si aucune commande n'est entrée après l'affiche du prompt.


exemple :


$ set toto titi tata

$ echo $2

titi

$ shift 2 ; echo $1

tata

$ set `who am i`

$ echo $*

bayreuth!dr ttyp1 Jul 26 18:52

$ echo $0

sh

$ echo $$

245

$ echo $#

5

$ shift 2

$ echo $#

3

$ read a

ceci va devenir les nouveaux paramètres

$ set $a

$ echo $4 $6 $3 $2 $4 $5 $1

les paramètres devenir va les nouveaux ceci

$ readonly a

$ read a

nouvelle valeur de a

a: is read only

$


Les fonctions Korn shell


définition d'une fonction interne au shell (plus rapide) sans lancement de sous-shell


nom() { liste de commandes ; }

ou bien

function nom { liste de commandes ; }


La variable nom apparaät dans la liste des variables et peut Þtre supprimée par la command unset nom

on peut utiliser les variables de position $1 $2 ¼ dans la fonction ce seront les paramètre d'appel de la fonction comme pour l'appel d'un script.


Attention les fonctions ne sont pas exportable.


#!/bin/ksh

# commande compte

fac

fac() {

case $# in

0) break;;

1) echo 1; break;;

*) echo -n 1+ ; shift ; fac $* ; break;;

esac

}

fac h h h h hh h h h hh hjjlj jk j j jhg hgjh

fac

fac 1 2 3 4


exécution de compte

compte: fac: not found

1+1+1+1+1+1+1+1+1+1+1+1+1+1+1

1+1+1+1

Les redirections en Korn shell

Caractères spéciaux

Mécanisme de redirection


>référence redirection de la sortie standard (echec si le fichier existe et que la variable noclobber est positionnée).

>|référence idem sans prendre en compte noclobber

>>référence redirection sans troncature du fichier référence (écriture a la fin du fichier).

<référence redirection de l'entrée standard

<>référence idem avec ouverture en écriture en plus.

2> ref redirection de la sortie erreur standard

2>> ref redirection de la sortie erreur standard en mode append.


<& chiffre redirection d'un des descripteur standard

>& chiffre

2>& chiffre sur le descripteur chiffre.


<&- >&- 2>&- fermeture


digit> redirection du descripteur de fichier digit. Par exemple:

2>erreur redirige la sortie erreur sdtandard(2) sur la fichier de référence erreur.

(liste de commandes)

exécution dans un sous-shell, nouveau processus

{liste de commandes}

exécution dans le [sous]-shell courant.


$ echo toto >fic ; read a <fic ; echo $a

toto

$ compte 2>/dev/null

1+1+1+1+1+1+1+1+1+1+1+1+1+1+1

1+1+1+1

$ compte >/dev/null

compte: fac: not found

$


Opérateurs ; , & , | , && , || , |&

com1 ; com2 lancement en séquence attente de la fin de com1 avant l'exécution de com2

com1 & com2 lancement en mode détaché exécution imédiate des deux commandes, com1 est exécuté de faÛons asyncrone.

com1 | com2 redirection de la sortie de com1 dans l'entrée de com2.

com1 && com2 ET la commande com2 n'est exécuté que si com1 se termine avec un code de retour nul (vrai).

com1 ||€com2 OU idem avec un code de retour non-nul (faux)

com1 |& création d'un co-processus.




$ true && echo ok

ok

$ false &&€ echo ok

$ true || echo ok


$


Sous commande

possibilité dans un shell de faire interpréter une suite de commande comme des commandes d'une sous commande (un autre shell, un éditeur etc ¼)


com <<mot_clef

les commande placées

ici

sont interprétées

par la commande com

mot_clef


exemple


#!/bin/sh

# tdc fait des additions ....

dc <<Kaboum

$1

$2

+

p

q

Kaboum



$ tdc 4 5 6

9

$



SUCRE SYNTAXIQUE

STRUCTURES DE CONTR”LE



Code de retour


= 0 (Zéro) VRAI exécution réussie

¹ 0 (Non nul) FAUX erreur à l'exécution


La commande test deux formats


test expression

[[ expression ]]

attention il faut bien séparer les crochets de l'expression


La valeur de retour de la commande test est 0 si l'expression est vrai et non nulle sinon.



test sur les entiers


test i1 -eq i2

-eq = equal

-ne = not equal

-gt = greater than

-ge = greater or equal

-lt = lower than

-le = lower or equal



combinaisons d'expressions

(expression)

! négation

-a conjonction (and)

-o disjonction (or)


attention le -a est plus prioritaire que le -o .



code de retour d'une commande composé = code de retour de la dernière commande.



Quelques commandes utiles


commande code de retour effet

: 0 interne-Néant

true 0 externe-Néant

false 255 externe-Néant



Tests sur les chaänes de caractères :

test -z chaäne test de longueur nulle

test -n chaäne test de longueur non nulle

test ch1 = ch2

test ch1 != ch2

test chaäne vrai si chaäne existe, chaäne non nulle



Tests sur les fichiers


-r file true if the file exists and is readable.

-w file true if the file exists and is writable.

-f file true if the file exists and is not a directory.

-d file true if the file exists and is a directory.

-s file true if the file exists and has a size greater than zero.

-b file true if the file exists and is a block special device.

-c file true if the file exists and is a character special device.

-h file true if the file exists and is a symbolic link.

-g file true if the file exists and has setgid bit set.

-k file true if the file exists and has sticky bit set.

-u file true if the file exists and has setuid bit set.



Test de rattachement à un terminal

test -t [entier, 1 par défaut]

test si le descripteur est rattaché à un terminal.

Sélection


if liste_de_commandes1

then liste_de_commandes2

[ else liste_de_commandes3 ]

fi


si code de retour de liste_de_commandes1 = 0

exécution de liste_de_commandes2

sinon exécution de liste_de_commandes3


Imbriqués

if ¼

then ¼

elif ¼

then

elif ¼

¼

fi



if test -f toto

then echo toto existe

else

echo il faut cree toto

echo merci d'avance

fi


Sélection suite le branchement multiple


case chaäne in

motif) liste_de_commandes ;;

motif) liste_de_commandes ;;

motif) liste_de_commandes ;;

esac


Les motifs sont fabriqués avec les caractère spéciaux d'expention de nom.

L'interpréteur cherche le premier motif que la chaäne satisfait.

exécute les commandes associées et sort du case.


Le motif * permet d'avoir un comportement par défaut il faut évidement le placer en dernière position.


exemples de motifs :


case $1 in

*o*t*| *t*o*) echo $1 contient les lettres o et t ;;

*o*) echo $1 contient la lettre o ;;

*t*) echo $1 contient la lettre t ;;

*) echo $1 ne contient ni t ni o ;;

esac


Itération Bornée


for variable [ in chaäne chaäne ¼ ]

do

liste de commandes

done


par défaut la liste de chaäne est $*


la commande est exécutée successivement pur toutes les valeurs énumérées, qui sont affectées successivement à la variable de contrîle.


par exemple :


for i in *

do

echo $i

done


est équivalent à ls.



Itérations non bornées


Boucle tant que :


while commande1

do commande2

done


La commande2 est exécuter tant que la commande1 a un code de retour nul. (condition de continuation).


Boucle jusqu'à ce que


until commande1

do commande2

done


La commande2 est exécuter jusqu'à ce que la commande1 ait un code de retour nul. (condition d'arrÞt).



Sorties Brutales des boucles


break [n] sort de n (1 par defaut) de n niveaux de boucle

continue [n] fait continuer l'exécution a la fin de la nième boucle


ex:le code suivant est équivalent à la commande ls

for i in *

do for j in 1 2 3

do

if test $j -eq 2 ; then continue 2 ; fi

echo $i

done ; done

Le traitement des signaux


trap handler nsig1 nsig2 ¼


La commande trap permet de spécifier le comportement du shell à la réception d'un signal (indiqué par son nom ou son numéro).


A la réception d'un signal la commande handler est exécutée

Puis le shell reprend sont exécution au point de réception du signal.

Dans le cas de reception simultané de plusieurs signaux le korn shell exécute les handler dans l'odre défini par les numéros de signaux.


trap "" 2 3 signaux intr et quit ignorés


trap - sig comportement par défaut

( interruption, et interruption et création d'un core.)


Si un signal était ignoré par le shell a son lancement il n'est plus possible de positioner un handler sur se signal!


trap handler EXIT la commande handler est réalisé a la fin du script quelle que soit la raison de terminaison (excepté SIGKILL). Si le trap est défini dans une fonction le handler est exécuté a la fin de la fonction.


Le korn shell introduit des signaux spéciaux


DEBUG le handler est exécuté après chaque commande

ERR le handler est exécuter après chaque commande de code de retour non nul.


trap sans argument affiche la liste des handler associés a chaque signal




Le signal 1 (HUP) de fin de session


Le shell propriétaire d'une session envoi quand il meurt un signal 1 à tous les processus de la session afin que vous soyez délogé proprement. Mais si vous voulez lancer un processus qui doit tourner pendant votre absence il faut utiliser la commande nohup .


nohup commande

le processus créé ignore le signal SIGHUP de fin de session.


il est possible pour un script de se protéger avec

trap "" 1.



La commande select


select var [in mots¼] do list done


echo choix de véhicule

select a in avions bateaux voitures camions

do

echo bravo vous avez choisi un $a

echo "un autre choix de véhicule (^D pour finir)"

done


Si in word est omis la variable $* est utilisé.


La commande select prompt l'utilisateur a choisir parmi les differents mots de la liste et place le mot selectioné dans la variable var l'ensemble de la ligne est placé dans la variable REPLY.

Si la réponce n'est pas dans l'interval d'entier légaux la variable var est positionée a nul.


Controle de taches


On appel un tache un groupe de processus réalisant une commande.

Les taches sous ksh peuvent Þtres dans trois états bien distincs


1) Actives en premier plan

2) Actives en tache de fond

3) Stoppées en tache de fond.


L'état 1) est l'état de toute taches lancée normalement.

Pour l'état 2) il suffit de lancer la commande en tache de fond avec l'opérateur &. Si la commande utilise le terminal (tty input et/ou output) elle est stoppée et passe dans l'état 3).

On peut faire passer un processus de l'état 1) à 3) avec le caractère spécial <susp> ^Z


Pour connaitre les processus en tache de fond :

jobs -l


Manipulation de ces taches :

fg %job faire passer la tache en premier plan (mode 1)

bg %job faire passer la tache en mode actif en tache de fond.

kill -sig %job tuer la tache


La tache %job peut Þtre accèdée par une des références suivantes :

%nombre la tache numéro

%mot les taches commencant par mot

%?mot les taches contenant mot

%% ou %+ la tache courante

%- la tache précédente


PID le PID d'un des processus de la tache




exemple de manipulations de taches :

$ vi &

[1] 19546

[1] + Stopped (tty output) vi &

$ vi <-- frappe de ^Z

[2] + Stopped vi

$ jobs -l

[2] + 19551 Stopped vi

[1] - 19546 Stopped (tty output) vi &

$ kill -9 %1

[1] - Killed vi &

$ jobs -l

[2] + 19551 Stopped vi


Alias


Le premier mot de chaque commande est testé pour l'existence d'un alias, et renplacé par son alias si il existe. Si le dernier caractère de l'alias est un blanc le mot suivant dans la commande est aussi testé pour la presence d'alias.

alias [-x] [nom=chaine]

-x pour exporter les alias aux sous-shells

Création:

alias nom=chaine


Destruction:

unalias nom


utilisation :

$ alias history='fc -l'

$ history

1 alias history='fc -l'

2 history

$ alias cou="echo coucou"

$ cou

coucou

$alias # liste des alias

autoload=typeset -fu

false=let 0

functions=typeset -f

hash=alias -t -

history=fc -l

¼


Expressions arithmétiques


Si une varaible est typé entière par la commande

typset -i variable

alors toute valeur d'affectation de la variable est evalué comme une expression arithmétique.


Un expression entre double parenthèses précédée d'un dolars est interprétée comme une expression artihmétique et évaluée et substituée dans la ligne : $((expression)), l'expression est considérée comme entre quote, les caractères spéciaux sont ainsi déspécialisés.


Par exemple


$ echo $((5%3))

2

$ typeset -i nb

$ nb=78+6-3

$ nb=$(( (-4*-9)/6 ))

$ echo nb

6

$


Test et expression arithmétiques :


exp1 -eq exp2 Vraie si exp1 est égale à exp2. (equal)

exp1 -ne exp2 Vraie si exp1 est différente de exp2.(not equal)

exp1 -lt exp2 Vraie si exp1 est inférieur à exp2.(less than)

exp1 -gt exp2 Vraie si exp1 est supérieur à exp2.(greater than)

exp1 -le exp2 Vraie si exp1 est inférieur ou égale à exp2.

(less or equal)

exp1 -ge exp2 Vraie si exp1 est supérieur ou égale à exp2.

(greater or equal)


[attention:les opérateurs de comparaison >,>=,<,<=,==,!= sont utilisé pour les chaines de caractères].



Une expression composé peut Þtre fabriqué avec les primitives suivantes, litées dans l'ordre décroissant de priorité :


(expression) Vraie, si expression est Vraie.Utile pour regrouper les expressions

! expression Vraie si expression est fausse.

exp1 && exp2 Vraie, si exp1 et exp2 sont Vraies.

exp1 || exp2 Vraie, si exp1 ou exp2 est Vraie.



Utilisation dans une boucle :

#!/bin/ksh

#creation d'une suite super croissante dans un tableau A

typeset -i somme=0 indice=0

#nombre d'elements de la suite donner en entrée

typeset -i n=$1

if [[ ($n -lt 0) || ($n -gt 1023) ]]

then

echo "usage : $0 n avec 0<= n <= 1023"

exit 1

fi


while [[ $n -gt $indice ]]

do

somme=$RANDOM+somme

A[$indice]=$somme

indice=indice+1

done


indice=0


while [[ $n -gt $indice ]]

do

print -n "A[$indice]=$A[$indice] "

indice=indice+1

done




LesConstantes

[base#]n

par exemple la constante 8 s'écrire

2#1000 8#10 8 36#8

la base peut variée de 2 à 36 la base 36 repréenter par 0-9A-Z



Les opérateurs


Les opérateurs sont ceux du language C soit


- moins unaire

+ addition

* multiplication

/ division

% modulo

- soustraction



La commande interne getopts


getopts optstring var [arg ...]


La commande getopts extrait les options définies dans la chaine optstring une à une des argument [par defaut les arguments d'appel du shell] et place cette option dans la varaible var.


Dans optstring si un caractère est suivit de : cela indique que l'option est suivie d'une chaine qui est alors stoquée dans OPTARG




$ while getopts abf: op -a -e -b -f toto bib

> do

> case $op in

> a) echo option A ;;

> b) echo option B;;

> f) echo fichier $OPTARG

esac

done

option A

ksh: getopts: e bad option(s)

option B

fichier toto



banner affiche les paramètres en grande lettres


basename dirname

découpe une référence abolue /dir1/dir2/nomdebase

basename le nom du fichier sans la partie directory:nomdebase

dirname seulement le nom du directory: /dir1/dir2


bc calculateur intéractif à très grande précision


cal [année]

affichage d'un calendrier de l'année


cb enjoliveur de programmes C (C beautifier)

ne pas faire cb <toto.c >toto.c !!!!

mais cb <toto.c >new.toto.c

ou {rm toto.c ; cb >toto.c} < toto.c


cat [-su] [-v [-t] [-e]] files...

envoie le contenu des fichiers files sur la sortie standard

l'entrée standard est symbolisée par un -

Par défaut l'entrée standard (stdin) est envoyée sur la sortie standard (stdout).

options:

-s pas de messages d'erreur sur les fichiers inexistants

-u pas de bufferisation de la sortie (char par char)

-v affichage des caractères non imprimables avec le format : ^X (000 à 040) et ^? (del 0177) M-x pour les autres ou x est le caractère associé au 7 bits de poids faible

-e affichage d'un $ a la fin des lignes

-t affichage de <tab> par ^I


exemple:

cat fic1 - fic3 <fic2 >toto équivalent à

cat fic1 fic2 fic3 >toto


cd -> exercice donner la définition de cd en franÛais !


chown [-R] owner file ...

chgrp [-R] group file ...

change le propriétaire ou le groupe des fichiers (-R récursivement dans les sous catalogues)

comm [- [123]] file1 file2

selection/élimination de lignes communes à deux fichiers

envoie sur stdout trois colonnes de mots avec

ceux file1 uniquement /de file2 uniquement / mots communs

les option permet d'éliminé une ou plusieurs colones.


cp [-ifpRr] [file1 file2] [files... cat] copie de file1 sur file2

copie des files dans le catalogue cat

options:

-i interactif

-f détruit file2 ou cat (danger!!!)

 -p sans changer les permission ni le propriétaire si possible.

-r|R récursif avec pour -R


cut , paste Manipulation de fichiers

cut: permet d'extraire des colonnes d'un fichier

paste: permet de fusionner en colonnes plusieurs fichiers


date donne la date courante,si superU permet de changer la date


dc (desk calculator) calculette



df block disk libres affiche le nombre de block libre sur chaque disque logique

ex: sur woodstock

Filesystem kbytes used avail capacity Mounted on

/dev/dk0a 23783 20166 1238 94% /

/dev/dk0c 66487 59654 184 100% /usr

/dev/dk0d 22759 550 19933 3% /tmp

/dev/dk0e 95111 72661 12938 85% /etudiants

/dev/dk0g 85455 36196 40713 47% /usr/adm

fillmore:/users/ens 1045329 829221 111575 88% /users/ens

fillmore:/users/staff 1045329 829221 111575 88% /users/staff


commandes de comparaison de fichiers


diff, diff3 , sdiff, cmp


cmp file1 file2

comparaison caractères par caractères de deux fichiers


diff file1 file2 (dir 1 dir2)

diff genere sur la sortie standard une liste d'instructions ed

qui permette de transformer le fichier file1 en file2

n1 a n3,n4 (ajouter les ligne n3 à n4 en position n1)

n1,n2 d n3 (détruire les lignes n1,n2 )

n1,n2 c n3,n4 (changer les lignes n1,n2 en les lignes n3,n4)

après chacune de ces commandes sont écrites les lignes affectée de chaque fichiers qui sont impliquées < pour file1 et > pour file2


du résume l'utilisation du disque

-a affiche tous les fichiers hérachiquement avec les catalogues en indiquant pour chaque objet la place utilisé.

-s (silencieusement) juste un résume global pour chaque catalogue indiqué (. par défaut).


find références [expressions]

find recherche récursivement dans les catalogues donnés en argument les fichiers vérifiants l'expression booléen écrite avec les primitives suivantes :


 -name regexp vrai si le nom du fichier vérifie

-perm mode (mÞmes arguments que chmod )

mode octal vrai si les droits sont exactement mode

-type char vrai si

char = f file

d ctalogue, b fichier spécial bloc, c caractère spécial bloc, p FIFO, s socket etc ¼

-user username

-group gname

-nouser vrai si utilisateur inconnu

-print affiche la référence toujours vrai

-exec commande

vrai si la valeur de retour dans le shell est nulle

la fin de la commande doit Þtre matérialisé par \;

on peut introduire le nom du fichier dans la commande

par {}.

-ok cmd mÞme chose que exec mais avec confirmation de l'utilisateur

-atime n vrai si l'on a accéder au fichier dans les n dernier jours

exemples:

effacer tous les fichiers a.out et les fichiers d'extention .o auquel on n'a pas fait d'accès depuis une semaine:


find / \( -name a.out -o -name '*.o' \) -atime +7 -exec rm {} \;






env [name = value] ¼ [command [arguments ¼]]

positionner des variables d'environnement pour une commande

sans paramètre affichage

exemple: env TERM=vt100;


expr evaluation d'expressions

ex: expr 3 \* 4

12


file détermine le type des fichier

peu fiable.


fsck file systeme check commande de réparation d'un disque abimé lors d'un crah du système


grep rechercher des motifs dans un fichier


kill -signal PID envoyer un signal à un processus


killall tue tout les processus, permet de préparer l'arrÞt de la machine


ld éditeur de liens


lex analyseur lexical


line compteur de ligne


lint correcteur de C


ln création de liens (éventuellement de liens symbolique comme pour les catalogues)


logname nom de l'utilisateur


lp envoi d'un fichier a l'imprimante


ls listage des catalogues


mail, mailx, elm utilitaires de courrier


make fonction de maintenance mise a jour d'exécutables de programmes


mesg manipulation des droits d'accès au terminal courant


mkdir création de catalogue


more, pg affichage ergonomique de fichiers


mv mvdir changement de référence d'un fichier ou d'un catalogue


newgrp changement de groupe réel


news les nouvelles


nice -nn commande

diminue la priorité de commande


nl [file]

numéroteur de lignes

tsort

tri topologique

nohup

protection contre le signal 1 SIGTERM

nroff troff ++

commande de mise en page (beurk).


od [-bcdosx] file

dump octal, decimal d'un fichier

pack,unpack,pcat

compression décompression, affichage d'un fichier compressé (algorithme Huffman).


passwd , yppasswd

Changer de mot de passe.

pr

filtre de mise en page pour l'imprimente

prof

outil de mise au point de programmes

ps [-delafw]

Etat des processus

pwd

affichage du répertoire de travail.

rm [-iR] ref

destruction d'une référence

rmdir ref

destruction d'un répertoire

sed [-e "expression"] [files ¼]

[-f fichier_d'expression] [files¼]

éditeur de flux

a utiliser avec les expression rationelles.


size file

taille des différents composant d'un exécutable.

sleep n

Attente en sommeil de n secondes


sort [options] [[+deb -fin]*] [références...] [-o sortie]


Tri des fichiers référencés envoyer sur la sortie standard ou dans le fichier sortie

Le tri par défault est un tri lexicographique sur l'ensembles des lignes des fichiers.

options: -n tri numérique

-b les blanc en début de champ sont ignorés

-tx utilise x comme séparateur de champ

+deb -fin limite les comparaisons au champs décrits


exemple:

sort +1r -2 +5n -6 fic

tri sur le 2ième en lexicographique inverse

puis en numérique sur le 6iéme


spell

correcteur orthographique (en anglais)

split [-l NN] [-b NN] [file [nom]]

découpe un fichier en plusieurs fichiers

-l NN NN lignes par fichiers

-b NN

En fichiers de NN octets

si NN = nnk de n kiloOctets

si NN = nnm de n MégaOctets

Les fichiers on pour référence soit

aaa,aab,aac,¼

Soit

motaaa,motaab,motaac,¼



strip (cc -s )

retire la table des symbol d'un binaire équivalent à l'option -s du compilateur (ceci permet de prendre moins de place sur disque!).

stty

manipulation de la ligne terminal<->machine

su utilisateur

Permet de changer de uid effective

sync

assure la syncronisation des disques.

tail -nn ref

head -nn ref

filtre qui permet de prendre la fin ou le debut d'un fichier.

tar [-xcvf] [archive] [ref¼]

archiveur pour lecteur de bande utilisable sur disque dur. Cette commande permet de transformer une arborescence en un seul fichier pour un transport plus agréable.

-v verbose

-xf [archive] fichiers¼

eXtraction des fichiers de l'archive

-cf [archive] fichiers¼

Création d'une archive avec les fichiers.

Si l'option -f n'est pas utilisée c'est le lecteur de bande qui est utilisé comme archive.

Pour utiliser tar comme un filtre on utilise "-" comme nom d'archive.


tee [ref]

filtre simple qui sauvegarde une comme de ce qui est écrit sur la sortie standard dans le fichiers ref. ex: com | tee resultat , permet de voire les resultats à l'écran tous en les sauvegardant dans le fichier resultat.


time commande

Donne le temps d'exécution de la commande

touch ref ¼

change la date de dernière modification du fichier "touché".

tr[-cds] ch1 ch2

filtre qui converti les caractère de ch1 en caractères de ch2, un ensemble de couples.


tty

référence du terminal


uname

nom du système


uniq file

donne les lignes répétées d'un fichier.


wall

write à tous les utilisateurs logés.


wc [-lcw] files

filtre qui compte ligne mot et caractères.


who

liste des utilisateur logés.


write utilisateur

envoi de message sur un terminal



vi éditeur vidéo


éditeur pleine page


vi

vi filename

vi +nn filename saut jusqu'à la ligne nn

vi +/regexp filename saut jusqu'à la première ligne contenant regexp



Tampon temporaire


Le travail d'édition sur le tampon n'est validé qu'après une commande d'écriture :w (write)


Les modes de vi


- mode déplacement

- mode insertion/édition

- mode commande


Le mode déplacement est le mode standard oò l'entrée est bufferisée par caractères.


Le mode insertion n'est pas bufferisé et doit Þtre terminé par le caractère <Esc> .


Le mode commande est bufferisé en ligne.




Le mode déplacement


les touches hjkl et les flèches permettent de déplacer le curseur dans le tampon.


<return> fait passer à la ligne suivante

^f (^u) une page en avant (en arrière)

<n>G saut sur la nième ligne par défaut en fin de fichier


les touches suivantes ont aussi des effets :

^N ^P + - $ | ^U ^D ^B H M L


Recherche de motif

<n>f<car> recherche sur la fin de la ligne la nième occurence du caractère (F dans le début de la ligne) et positionne le curseur dessus.

<n>t<car> idem mais le curseur est sur la lettre précédente

<n>T<car>


; répéter la dernière commande fFtT

, dans le sens inverse



<n>/motif/<return> recherche dans la suite du tampon la première occurence du motif

<n>?motif?<return> en remontant dans le tampon.


n répétition de la dernière recherche de type /.../

N ?...?


Le mode insertion


Toutes les insertions de chaine doivent Þtre terminées par le caractère <Esc>


a<chaine> immédiatement après le curseur

i<chaine> immédiatement avant le curseur

A<chaine> en fin de ligne

I<chaine> en début de ligne

o<chaine> insère la chaine dans une nouvelle ligne crée sous la ligne courante

O<chaine> idem dans une ligne au dessus

en mode insertion

^H ou <touche_effacement> supression du caractère précédent.

^V permet d'insérer les caractères spéciaux, exemple: ^H




Commandes de suppression de texte


<n>x ou <n>d<espace> supprime le caractère sous le curseur

<n>X idem avant le curseur

D supprime la fin de ligne à partir du curseur

<n>dw supprime le mot

<n>dd supprime la ligne










Modification de texte


r<car> remplacement du caractère sous le curseur

R<chaine><Esc> remplace le caractère par la chaine

<n>s<chaine><Esc> remplacer n caractères par la chaine

<n>S<chaine><Esc> remplacer n lignes par la chaine

C<chaine><Esc> remplacer la fin de ligne par la chaine

<n>cw<chaine><Esc> remplace le mot par la chaine

<n>cc<chaine><Esc> remplace les n lignes par la chaine



<n>J joint la ligne et le suivante


Les tampons (copier,coller)


26 tampon nommés a-z

"<lettre><n>yw copier 1 ou n mots dans le tampon

"<lettre><n>yy

"<lettre><n>Y copier la ligne courante (n lignes)

"<lettre>p coller le tampon après la ligne courante

"<lettre>P coller le tampon avant la ligne courante



Recherche

/regexp/ recherche de l'expression rationnelle vers l'avant

?regexp? recherche de l'expression rationnelle en remontant dans le fichier.


:n se placer sur la ligne n

Mode commande


:w sauvegarder le tampon sur disque

:w filename sauvegarder le tampon dans le fichier filename sur disque

ZZ ou :wq sauvegarder et quitter

:q quitter

:q! quitter sans sauvegarder

:e recharger le tampon a partir du disque

:e filename éditer le fichier filename

:!<commandeshell>

lancer une commande shell


Utilisation de commande ed/sed sous vi


[.,.] indique un intervalle de lignes sur lequelles effectuer la commande par defaut la valeur est la ligne "." (ligne courrante),

$ désigne la dernier ligne du fichier.


déplacement

: [.,.] m . déplace les lignes à la ligne indiquée.

: [.,.] t . recopie les lignes après la ligne indiqué

impression

: [.,.]p visualisation des lignes

: [.,.] l avec affichage des caractères non imprimables.

supression

:[.,.]d suppresion des lignes de l'intervalle.

substitution

: [.,.]s/expressionrationelle/motif/

oò motif peut contenir

& motif satisfaisant l'expression

\n nième champ de l'expression

% dernier motif de remplacement utilisé.

: [.,.]s/expressionrationelle/motif/g sur toute la ligne.

Expressions Rationnelles (vi,sed,emacs)

1. Tous les caractères saus les caractères spéciaux se correspondent. Les caractères spéciaux sont les "délimiteur" de l'expression plus \[. et parfois ^$*.


2. Un . correspond à n'importe quel caractère.

3. Un \ suivie par un caractère (suaf un chiffre ou ( et ) ) correspond avec le caractère.


4. Une chaine s non-vide entre crochets [s] (ou [^s]) correspond (ne correspond pas ) à n'importe qeul caractère de la chaine. Dans s, \ n'est pas un caractères spécial, et ] ne peut apparaitre que comme premier caractère. Une sous-chaine a-b avec a inférieur à b dans l'ordre ASCII correspond a l'interval inclusif de a à b.


5. Une expression de la forme 1-4 suivie de * correspond a une suite de 0 ou plus de correpondances de l'expression.


6. Une expression x de la forme 1-8 entre \(x\) correspond au mÞmes mots que x. Une expression de la forme 6 est appellé un champ.


7. Un \ suivie d'un chiffre n correspond a une copie exacte du mot qui a correspondu au n ième champs (forme 6).


8. Concaténation. Une expression x de forme 1-8, suivie d'une expression y de la forme 1-7 , correspond a une mot correspondant à x suivie d'un mot correspondant à y. Avec la correspondance de x etant la plus longue correspondance compatible avec une correspondance de y.


9. Une expression forme 1-8 précédée d'un ^ (suivie d'un $) doit correspondre à un début (une fin) de ligne. (ex: ^$ est une ligne vide).


10. Les expression définie par 1-9 séléctionne toujour la plus long correspondance en partant de la gauche (début de ligne).


11. Une expression régulière vide correspond à la dernière expression régulière utilisée.

Exemples


Afficher tous les fichiers du catalogue de travail

qui sont des fichier standard,

qui sont ouvert en ecriture pour le proprietaire

qui sont ouverts en lecture pour les menbres du groupe

dont le nom se termine par le caractere c


ls -l|grep '^-.w.r.*c$'



Afficher les couples nom d'utilisateur informations du fichier /etc/passwd, ce fichier est organisé comme suit :

logname:passwd:uid:gid:infos:home:shell


sed -e "s/^\([^:]*\):[^:]*:[^:]*:[^:]*:\([^:]*\):.*$/\1 \2/" /etc/passwd


¼

prof Compte prof pour DR,,,

andrieux Baba au Rhum,Noisy,0000,0000

ano ano,,,

banomyon banomyon,,,

behar behar,,,

bisot bisot,,,

brauda brauda,,,

chum chum,,,

deluca deluca,,,

fivaz fivaz,,4932,6026254

¼


Sous vi remplacer le mot sdtin pat stdin :

: 1,$s/sdtin/stdin/g

les shells 22 Stage