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 CONTRLE
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