Vous êtes sur la page 1sur 39

TP Unix

IMT Lille Douai – UV TSIO


Jean-François Colin & Jean-Philippe Vandeborre

TP1 : Commandes de base UNIX _______________________________________ 2


Utilisation du shell ___________________________________________________ 2
Commandes de bases du SGF ___________________________________________ 3
Caractères d'expansion ________________________________________________ 5
Commandes fichiers diverses ___________________________________________ 5
Répertoires _________________________________________________________ 6
La commande echo ___________________________________________________ 7
Redirections des entrées/sorties standards _________________________________ 8
Les tubes ___________________________________________________________ 9
Les variables _______________________________________________________ 10
Structures de contrôle ________________________________________________ 12
Exercices supplémentaires optionnels ___________________________________ 12

TP2 : Le SGF UNIX ________________________________________________ 13


Examen de fichier ___________________________________________________ 13
Droits et propriété ___________________________________________________ 14
Inodes ____________________________________________________________ 15
Les périphériques (devices)____________________________________________ 16
Exercices supplémentaires optionnels ___________________________________ 17

TP3 : Les processus UNIX ___________________________________________ 18


Identification _______________________________________________________ 18
Processus en séquence _______________________________________________ 18
Processus concurrents ________________________________________________ 19
Exercices supplémentaires optionnels ___________________________________ 24

TP4 : Programmation du shell UNIX __________________________________ 25


Création et exécution d'un fichier de commande ___________________________ 25
Passage de paramètres ________________________________________________ 26
Variables du shell ___________________________________________________ 28
Interruptions-Signaux ________________________________________________ 31
Exercices supplémentaires optionnels ___________________________________ 32

Annexes __________________________________________________________ 34
Commandes de base du SGF __________________________________________ 34
Répertoires usuels ___________________________________________________ 35
Caractères et expressions génériques du shell _____________________________ 36
Refcard Vi _________________________________________________________ 38
-2-

TP1 : Commandes de base UNIX

Utilisation du shell
Si la connexion s'est déroulée convenablement le prompt $ indique que l'interpréteur
attend votre commande. ^C (ctrl+c) permet d'interrompre une commande.
Pour chacune des commandes, préciser soit le résultat de son exécution s'il rentre
dans le cadre, soit l'interprétation que vous en faites.

Commandes diverses
date

who

who am i

uname -a

Aide
man man

man who

Utiliser l'aide pour déterminer l'argument à passer à date pour qu'elle n'affiche que
l'heure (date '...' ==> 09:56:11)

De manière générale, consultez la page d’aide d’une commande pour connaître


toutes ses possibilités. Ces pages de manuel peuvent paraître rébarbatives, mais elles
contiennent toutes les informations disponibles sur toutes les commandes du système.
Apprendre à utiliser les pages man est le premier pas vers l’autonomie sous Unix.

Prendre en main l'éditeur vi


Un filtre est une commande qui prend un flux en entrée, le transforme, pour finir par
l’envoyer en sortie. La commande cat n’effectue aucune transformation. Elle permet donc
de visualiser le contenu d’un fichier texte. C’est le premier filtre de base.

IMT Lille Douai – CERI numérique – JFC & JPV


-3-

vi est un éditeur qui semble de prime abord rudimentaire, mais il est en réalité très
puissant et, surtout, universel car il se trouve sur quasiment tous les systèmes Unix. Il
permet généralement d'accéder à des possibilités d'édition même dans un environnement
frustre, réduit par exemple à un interpréteur de commande. Il est bon d'en connaître au
moins les commandes élémentaires. Cet éditeur possède deux modes : le mode commande
et le mode insertion.
dd : suppression de Esc
la ligne courante
dw : suppr.
du mot Mode
courant Mode
Commande Insertion

x : supp. caractère i : insertion à la position courante


sous le curseur A : insertion en fin de ligne
a : insertion après la position courante

Pour quitter vi il faut être en mode commande :


• :x ou :wq permet de quitter vi en sauvegardant le document courant
• :w permet de sauvegarder sans quitter
• :q! permet de quitter sans sauvegarder

vi essai1.txt

cat essai1.txt

Commandes de bases du SGF


Commande touch pour créer un fichier vide
La commande touch permet de créer un fichier vide, mais également de modifier
la date de dernière modification d’un fichier à la date du jour.
touch monfichiervide

touch essai1.txt

Commande ls (list) pour lister le contenu d’un répertoire


Se placer dans le répertoire de travail en tapant cd. Créer (avec mkdir) quelques sous
répertoires pour pouvoir visualiser les effets des différentes variantes de ls.
Indiquer ou commenter le résultat des commandes suivantes ; s'aider éventuellement
de man.

IMT Lille Douai – CERI numérique – JFC & JPV


-4-

ls

ls -a : indiquer la différence avec la commande précédente

ls -l : le détail du résultat sera étudié plus loin

ls -ld

ls -C

ls -R

ls *.out

ls c*

Essayer des combinaisons d'options en vous aidant de la page man de la commande ls


(ex: ls -alR)

Commande cat (concatenate) pour afficher le contenu d'un fichier texte.


Utiliser man pour mettre en évidence la différence entre cat et cat -v.

Commande mv (move) pour déplacer un fichier


mv ancien_nom nouveau_nom

mv nom /tmp/nouveau_nom

Commande rm (remove) pour supprimer un fichier.


rm nom

Utiliser man pour comprendre l'effet des commandes suivantes:


rm -r

rm -ri

IMT Lille Douai – CERI numérique – JFC & JPV


-5-

Commande cp (copy) pour copier un fichier.


Comparer avec mv:
cp ancien_nom nouveau_nom

cp nom /tmp/nom

Caractères d'expansion
Créer les fichiers suivants (leur contenus est sans importance): ch1,ch2,ch3,ch4 (par
ex: echo bonjour >ch1 ou avec la commande touch)
Effet des commandes suivantes:
ls ch*

ls ch*.*

ls ch[1,4]

ls ch[1-4]

ls ch[1234567]

ls ?h[1-2,4]

Commandes fichiers diverses


Construire sous vi le texte suivant nommé text1(en respectant les retours chariots) :

Alice thought she saw a way


out of the difficulty, this time.
"If you tell me what language
I'll tell you the French for it!"

IMT Lille Douai – CERI numérique – JFC & JPV


-6-

Vérifier avec cat le contenu de text1, puis essayer et commenter:


grep tell text1

Vérifier avec man le rôle des options -v et -c de la commande grep. Essayer


grep -v tell text1

grep -c tell text1

sort text1

sort -r text1

sort text1 text1

wc text1

wc text1 text1

Utiliser man pour trouver l'option permettant de n'afficher que le nombre de mots de
text1

Créez le texte suivant (<CR> signifie Carriage Return, autrement dit, appuyez sur la
touche « entrée ») 1<CR> 2<CR> 3<CR> … 14<CR> - et enregistrez-le sous le nom
numtext et comparez :
sort numtext

sort -n numtext

Répertoires
Se placer dans le répertoire de travail par cd. Créer l'arborescence suivante avec mkdir
et cd :
./essai/essai1
./essai/essai2
./essai/essai1/essai3

IMT Lille Douai – CERI numérique – JFC & JPV


-7-

Se placer dans $HOME/essai/essai1/essai3. Contrôler à chaque étape en utilisant pwd


(pwd affiche /usr/usrn/essai/essai1/essai3).
Copier tous les fichiers du répertoire de connexion dans essai3 par cp $HOME/* .
Se placer dans $HOME (contrôler par pwd). Effacer récursivement tous les fichiers
de essai et des ses sous-répertoires par rm * -ri essai (ou rm -r essai)
Etablir l'arborescence des répertoires sous la racine jusqu'au niveau 2, avec ls et cd (la
racine est au niveau zéro)

La commande echo
echo est une commande d'affichage. Exécuter et comparer.
echo salut!

echo "salut!"

echo 'salut!'

b=bonjour
echo b

echo $b

echo salut b

echo "salut! $b"

echo 'salut! $b'

IMT Lille Douai – CERI numérique – JFC & JPV


-8-

Quelle différence entre "..." et '...' ?

date (pour rappel)


echo 'date'

echo `date` (attention au sens des quotes: Alt Gr 7 !)

echo "bonjour nous sommes le `date`"

echo 'bonjour nous sommes le `date`'

echo text1

echo cat text1

echo `cat text1`

Quel est le rôle de `...` ?

Redirections des entrées/sorties standards


Essayer et commenter les commandes ou séries de commandes suivantes.

echo bonjour >text2


cat text2

echo salut >text2


cat text2

IMT Lille Douai – CERI numérique – JFC & JPV


-9-

echo les amis>>text2


cat text2

ls -l >text3

<text3 sort

<text3 sort -r

<text3 grep Sept

cat zzzz (génére une erreur, le fichier zzzz n'existe pas. Voir la suite pour
comprendre...)
cat zzzz >text5 (idem)
cat text5

cat zzzz 2>text6


cat text6

Que représente les symboles > , < , >> et 2> ?

Puis lancer la commande rm text[2-9] (pour le ménage...)

Les tubes
Les tubes sont un autre mécanisme de redirection. Ils permettent de relier deux
commandes ou plus (la sortie de l’un vers l’entrée du suivant) sans passer par des fichiers
temporaires. Essayer et commenter:
echo salut les amis | wc

cat text1| sort

cat text1|sort >text2

IMT Lille Douai – CERI numérique – JFC & JPV


- 10 -

cat text1|grep th|wc -l

Les variables
Essayer et commenter:

set

echo PS1

echo $PS1

PS1="je suis le nouveau prompt!"

echo $PS1

PS1=$

echo $HOME

echo $PATH

cat .profile (ou cat .cshrc en C-shell)

echo $LOGNAME

echo "Type de terminal = $TERM"

set (pour mémoire)


date (pour mémoire)
set date

echo $1

IMT Lille Douai – CERI numérique – JFC & JPV


- 11 -

echo $2

set `date`

echo $1

echo $2

echo $3

echo $*

echo $#

set un deux trois

echo $1

echo $2

echo $3

echo $4

echo $*

echo $#

toto=titi
set

unset toto
set

IMT Lille Douai – CERI numérique – JFC & JPV


- 12 -

Structures de contrôle
set `date`

for i in $*; do echo $i;done

while true; do echo -n oui; done (arrêt par ^c)

Exercices supplémentaires optionnels


(pour plus de renseignements sur grep et find consulter les pages man)
Chacun de ces exercices consiste à écrire une seule commande Unix qui réalise
l'action demandée. La difficulté est croissante.
1) Commande grep. Rechercher dans tous les fichiers du répertoire courant ceux qui
contiennent le caractère e.
2) Rechercher dans tous les fichiers du répertoire courant ceux dont le contenu
commence par le caractère e
3) Rechercher dans $HOME les fichiers dont le nom ne comportent pas de a
4) Avec la commande find, rechercher sous /dev les fichiers qui ne sont ni de type
bloc, ni de type caractère.
5) Rechercher la même chose mais avec affichage de la ligne complète d'information
concernant le fichier trouvé (telle qu'on l'obtient avec ls -l). Attention! : il vaut mieux
exclure aussi les fichiers de type répertoire, sinon . , .. sont également listés!

IMT Lille Douai – CERI numérique – JFC & JPV


- 13 -

TP2 : Le SGF UNIX

Examen de fichier
Les commandes cat et file permettent d'obtenir des informations sur le contenu ou le
type des fichiers
Essayer et commenter (utiliser man pour comprendre):

cat text1

file text1

Créer un texte (text2) contenant la phrase bonjour les amis et essayer:


file text2

Créer un texte (text3) contenant la phrase echo bonjour les amis, puis essayer:
file text3

chmod +x text3 (Attribution du droit d'exécution sur text3)


file text3

Mettre en évidence avec file au moins quatre types différents de fichiers


éventuellement dans d'autres répertoires). En déduire le type d'analyse effectué par file.

Les commandes head et tail permettent d'avoir rapidement une idée du contenu d'un
fichier texte. Essayer :
head text4

head -5 text4

IMT Lille Douai – CERI numérique – JFC & JPV


- 14 -

tail -3 text4

tail +2 text4

Droits et propriété
Consulter les droits d'utilisation des fichiers du répertoire $HOME pour
respectivement le propriétaire, le groupe du propriétaire et les autres grâce à ls -ld

Essayer et commenter :

ls -l text1
cat text1

chmod -r text1
cat text1

chmod +r text1
cat text1

chmod 000 text1


ls -l text1

chmod 111 text1


ls -l text1

chmod 222 text1


ls -l text1

chmod 444 text1


ls -l text1

chmod 642 text1

IMT Lille Douai – CERI numérique – JFC & JPV


- 15 -

ls -l text1

Créer un fichier texte quelconque (text2). La commande chown permet de changer le


propriétaire d'un fichier. Essayer:
ls -l text2
chown root text2
Interpréter le résultat de la commande ci-dessus

Confirmer en consultant le manuel de la commande chown

Inodes
L'inode représente le fichier réel, c'est à dire un contenu et un ensemble d'information
s'y rattachant (date de dernière modification du contenu (ls -l), de dernière utilisation (ls -
lu), ou de dernière modification des informations associées (droits etc...) visible par (ls -lc).
Un même inode peut être manipulé par plusieurs noms situés éventuellement dans des
répertoires différents. Le système attribue un numéro unique à chaque inode (visible par ls -
i).
Mettre en évidence ces trois dates sur le fichier text3.

Créer un deuxième fichier (par ls >text4, par exemple) dans le répertoire essai. Noter
le numéro d'inode de text3 et text4 (ls -i).

Recopier text3 en text5 par cp. Noter le numéro d'inode de text5.

Créer un nouveau lien avec l'inode correspondant à text3 par ln text3 text6. Noter le
numéro de l'inode de text6.

text3 et text6 pointe le même inode. On dit que celui ci possède deux liens. Le
nombre de liens peut être visualisé par ls -li.

En utilisant ls -li constater les effets de rm text3.

De même constater les effets de mv text4 text7.

Quelle est la différence les deux commandes suivantes:


mv text2 text 8 et cp text2 text8;rm text2

IMT Lille Douai – CERI numérique – JFC & JPV


- 16 -

Expliquer le nombre de liens apparaissant pour le répertoire $HOME (visible par ls -


liad; pour comprendre le nombre de lien créer un sous répertoire, et consulter de nouveau
par ls -liad)

Aller sous la racine. Consulter les numéros d'inodes de . et de .. . Qu'en conclure ?

Revenir à votre répertoire de connexion par cd. Créer un fichier nommé par exemple
textusrx dans le répertoire /tmp. Positionner les droits de ce fichier de façon à ce que votre
voisin puisse créer un lien vers lui et l'utiliser. Modifier par vi ce fichier et observer les
effets surprenants du partage de fichier en écriture entre plusieurs utilisateurs simultanés.
Pour travailler à plusieurs sur une même machine, utiliser telnet ou ssh ou bien utiliser les
différentes consoles virtuelles obtenues avec ALT+F1, ALT+F2, etc.

Les périphériques (devices)


Sous Unix la notion de fichier unifie celles de fichier (au sens strict), de répertoires et
de périphériques (terminaux, disques, disques durs, bandes, clavier, imprimantes etc.), de
volumes, de tubes nommés, de sockets unix etc. Les entrées et sorties sur ces périphériques
sont vues par le système comme des opérations de recopie entre fichiers. L'ensemble des
fichiers device sont dans le répertoire /dev.

Examiner le contenu du répertoire /dev. Remarquer (ls -l) l'existence de deux types de
périphériques: mode bloc (brw-rw-...) ou mode caractère (crw-rw-...).

La commande tty affiche le nom du fichier correspondant au terminal courant. Noter


le nom de votre terminal (noté /dev/ttyn dans la suite)

Exécuter et interpréter:
date >/dev/ttyn

Exécuter et interpréter:
date >`tty`

IMT Lille Douai – CERI numérique – JFC & JPV


- 17 -

Un fichier device spécial, /dev/null , joue le rôle de trou noir. Essayer :


echo bonjour >/dev/null

cat /dev/null

Exercices supplémentaires optionnels


1) Créer le répertoire essai et y mettre un fichier quelconque (par date >text3, par
exemple). Afficher les droits associés au répertoire essai. Interpréter la signification des
droits rwx lorsqu'ils sont appliqués à un répertoire. (procéder systématiquement: positionner
successivement le répertoire en rw_, puis r-x, et puis _wx, et dans chaque cas examiner s'il
est possible de voir le répertoire, de le lister par ls,de le traverser par cd, de lire, créer ou
modifier des fichiers du répertoire etc.
2) Ecrire la commande permettant d'extraire les lignes 3 à 7 d'un fichier
3) Comment positionner les droits suivants sur un fichier f quelconque:
• -rwxrwxrw-
• -r-x--x---
4) Généralement, l’utilisation de la commande chown est réservée au super-utilisateur
(root). Pourquoi ?

IMT Lille Douai – CERI numérique – JFC & JPV


- 18 -

TP3 : Les processus UNIX

Identification
Un processus interpréteur de commande (shell) est lancé par le système après la
connexion de l'utilisateur.
Un processus possède un certain nombre d'attributs: identification (PID),
propriétaire(UID), groupe propriétaire(GID), terminal d'attachement(TTY), identification du
processus pére (PPID),priorité(PRI) etc.
Processus attachés au terminal de l’utilisateur: essayer ps ou ps -l ou ps -f. Identifier
les processus mis en évidence. Comment s'exprime la relation de filiation entre sh et ps ?
Utiliser man pour comprendre et noter la signification des attributs affichés par ps -l:

Processus en séquence
Le séparateur ; permet de séquentialiser un ensemble de commandes. Essayer et
commenter.
date ; who

date ; ps ; who ; ps

date ; who >text2


cat text2

(date;who) >text2
cat text2

(date;who;ps;echo "c'est fini!") >text2

IMT Lille Douai – CERI numérique – JFC & JPV


- 19 -

cat text2

Quel est le travail globalement effectué par la séquence de commandes suivantes ?


(text1 est supposé contenir toujours le texte tiré d'Alice)
grep th text1 > /tmp/temp ; wc -l /tmp/temp ; rm /tmp/temp

Processus concurrents
Le caractère & permet d'indiquer que la commande qui le précède lance un processus
en parallèle avec les processus courants (notamment le shell). Le système répond alors en
indiquant le numéro (PID) du processus créé. Ce mode est également appelé
fonctionnement en arrière plan car il permet à l'utilisateur de lancer une opération longue
(une compilation par exemple) et de continuer à travailler en même temps.
Comparer:
sleep 10

sleep 10 &

ps

ps & (cette dernière commande permet de vérifier que c'est bien le PID qui est
affiché)

Constater qu'il est possible de travailler avec une tache en arrière plan:
(while true
do
sleep 10;set `date`;
echo "Il est $4 . C'est bientôt l'heure de la pause...";
done
)&

Le programme ci-dessus va géner l'interprétation des résultats qui suivent. Il faut


donc le supprimer par kill -9 PID. Il n'est pas toujours simple de repérer le numéro du
processus à détruire. Dans le cas présent le plus simple est de repérer le processus shell fils
(un shell dont le pére est un autre shell) Attention à ne pas détruire le shell principal ! Celui-
ci est reconnaissable au fait que le PID de son pére vaut 1 (processus /etc/init; le processus
0 est l'ordonnanceur.

IMT Lille Douai – CERI numérique – JFC & JPV


- 20 -

Comparer du point de vue de l'exécution::


sleep 10;echo fin!

(sleep 10 &) ; echo fin!

Comparer du point de vue des processus créés (notamment du nombre de shell(s)):


sleep 10& puis rapidement... ps

(sleep 10;echo 1)& puis rapidement ps

(sleep 10;echo 1;sleep 10;echo 2;sleep 10;echo 3)& puis …


ps avant l'apparition du 1
ps aprés le 1 et avant le 2
ps avant le 3 et aprés le 2
ps aprés le 3
(éventuellement rediriger ces résultats dans des fichiers pour pouvoir les étudier)

Mêmes manipulations avec:


(sleep 10;echo 1;(sleep 10;echo2);sleep 10;echo3)&

Conclure: dans quel cas y-a-t-il création d'un shell fils ?

Détruire tous les processus courant (sauf votre shell bien sûr).

IMT Lille Douai – CERI numérique – JFC & JPV


- 21 -

Les processus pipelinés avec | (caractère obtenu avec AltGr+6) correspondent pour le
système à l'exécution en parallèle de chacun d'entre eux. Une zone tampon est créée
permettant l'échange de données. Cette zone impose un synchronisation aux processus du
type lecteur/rédacteur: un processus ne peut y déposer de données si elle est pleine, et ne
peut la lire si elle est vide.

Essayer et commenter.

sleep 10 | ps

Comparer le résultat avec celui de la commande:


sleep 10 | wc

Quelle différence entre ps et wc explique cette différence de comportement?

Détruire les processus ci-dessus encore en activité par kill -9

Dans une commande pipelinée les processus sont lancés en parallèle, mais on peut se
demander quels sont les liens de filiation entre ces processus. Par exemple l'exécution de la
commande f1|f2|f3|...|fn génère (au moins) n processus (n+1 en comptant le shell) mais
l'arborescence correspondant aux relations de filiations pourrait être par exemple :
sh sh

f1 ou f1

f1 f2 f3 ... fn f2

...

fn
ou une autre arborescence…
Etablir le schéma de relations entre les processus correspondant à l'exemple suivant:
ps –l | tee fichier |wc | wc | grep 1
(tee est une commande qui recopie son entrée standard sur sa sortie standard et sur le
fichier passé en argument; tee est utilisée pour capter les informations qui circulent dans un
tube)

IMT Lille Douai – CERI numérique – JFC & JPV


- 22 -

IMT Lille Douai – CERI numérique – JFC & JPV


- 23 -

En déduire le schéma général.

La commande read (en Bourne shell) permet de lire une chaîne sur l'entrée standard et
de l'affecter à la variable passée en argument. Essayer :
echo Frapper un mot
read m
echo "J'ai bien reçu $m !"

Un processus fils hérite de son père des descripteurs de fichiers et donc notamment
de l'entrée standard. Essayer et commenter :
if tty
then read m
echo "J'ai reçu $m!"
else echo "Je n'ai rien reçu !"
fi
(tty affiche le type de terminal utilisé /dev/ttyax et retourne la valeur vrai (0) s'il s'agit
effectivement d'un terminal; sinon il affiche 'not a terminal' et retourne faux (<>0))

IMT Lille Douai – CERI numérique – JFC & JPV


- 24 -

Un processus en arrière plan (background) perd l'entrée standard (assimilée à


/dev/null qui n'est pas un terminal) . Essayer et commenter :
if tty
then read m
echo "J'ai reçu $m !"
else echo "Je n'ai rien reçu !"
fi &

Exercices supplémentaires optionnels


1) un fichier de commande est un fichier contenant des commandes Unix (comme par
exemple le fichier com1 dans l'exemple ci-dessous).
$ cat com1
echo bonjour
echo tu va bien ?
$ ./com1
bonjour
tu vas bien ?
$
En revenant sur les exercices qui précédent, imaginer le mécanisme (en terme de
création de processus) qui permet l'interprétation de la ligne de commande com1

2) Ecrire une commande qui crée à l'exécution deux processus reliés par un tube. Le
premier est une boucle infinie produisant des entiers aléatoires sur sa sortie standard. Le
deuxième est une boucle infinie lisant les entiers en provenance du tube et les affichant.
La fonction interne bash $RANDOM (ce n’est pas une constante) renvoie un entier
pseudo-aléatoire dans l’intervalle 0 - 32767. Pour avoir un nombre aléatoire entre 0 et
MAX - 1, on utilisera : nombre = $RANDOM ; MAX=10 ; let "nombre %= MAX"
Le but est de montrer que le processus consommateur (le deuxième) synchronise son
activité avec le processus producteur.
Exemple d'exécution:
(attente 5s...)
Bien reçu 5
(attente 2s...)
Bien reçu 2
etc.

IMT Lille Douai – CERI numérique – JFC & JPV


- 25 -

TP4 : Programmation du shell UNIX


Il est possible de créer des fichiers de commandes sous UNIX . Ceux-ci sont
exécutables de deux façons différentes: en passant le fichier créé en argument d'un nouveau
shell, ou en en demandant l'exécution à partir de la ligne de commande. Il faut dans ce cas
que les droits d'exécution soient activés.

Création et exécution d'un fichier de commande


Essayer et analyser les commandes suivantes.

echo 'echo Voici la date : `date`' >mydate


sh mydate

./mydate (si le repertoire courant “.” n’est pas dans le PATH)

chmod 700 mydate


./mydate

Créer le fichier de commande (sleep 50) qui "dort" pendant 50 s.

Créer, avec vi, le fichier de commande (numproc) qui affiche le nombre de processus
actifs.

Créer le fichier de commande (mytime) qui affiche uniquement l'heure (hh:mm:ss).

Créer le fichier de commande (4top) dont le comportement est le suivant:


$4top
==> Au quatrième TOP il sera exactement : (suivent 4 bip séparés d'une seconde...,
puis l'affichage de l'heure) 15:43:32
(Rem : les bips sont produits par echo <Ctrl> g ; la séquence <Ctrl > v permet sous
vi d'introduire ensuite le caractère <Ctrl> g)

IMT Lille Douai – CERI numérique – JFC & JPV


- 26 -

Ecrire la commande mycal qui affiche le calendrier du mois courant en français


(utilisation de case et grep -v [A-Z]).ex:
cal
==>
August 1991
S M Tu W Th F S
1 2 3
4 5 6 7 8 9 10
11 12 13 etc..

mycal
==>
Aout 1991
D L Ma Me J V S
1 2 3
4 5 etc...

Passage de paramètres

Récupération d'un argument.


Créer la commande myvi qui utilise vi en le modifiant ainsi: l'appel myvi text3 affiche
pendant une seconde la phrase "Edition de text3 sous vi", puis passe sous vi, puis affichage
du nombre de caractères, mots et lignes de text3.

IMT Lille Douai – CERI numérique – JFC & JPV


- 27 -

Récupération de deux arguments.


Modifier la commande mycal ci-dessus de façon à permettre (comme dans la
commande cal prédéfini) le passage (sous format numérique) du mois et de l'année. Ex:
mycal 9 1991
==>
Septembre 1991
D L Ma Me J V S
1 2 3 4 5 6 7
9 10 11 etc...
Si aucun arguments n'est passé le comportement est celui défini ci-dessus; si un seul
argument est passé il s'agit d'un mois et l'année est l'année courante par défaut (utiliser case
pour tester le nombre d'arguments)

IMT Lille Douai – CERI numérique – JFC & JPV


- 28 -

Récupération d'un nombre quelconque d'arguments.


Créer la commande (mycat) qui agit comme cat mais en mettant un séparateur
(constitué par le nom du fichier) entre les différents textes passés en arguments (utilisation
de for). Exemple :
cat text2 text3
==>
salut
les amis
bonjour

mycat text2 text3


==>
-- Fichier text2 --
salut
les amis
-- Fichier text3 --
bonjour

Variables du shell
set sans argument fournit l’ensemble des couples variables-valeurs définis pour le
shell courant. env (ou export) sans arguments fournit le sous-ensemble des couples
variables-valeurs qui seront exportés au shell fils. export avec argument permet d'ajouter
une variable à cette liste. L'affectation dans le shell courant s'effectue par le signe =.
Essayer et analyser.
env

PS1="Hello! "
env

sh
env

IMT Lille Douai – CERI numérique – JFC & JPV


- 29 -

exit

PS1="$ "

Essayer et analyser.
env

PS1="Hello! "
env

export PS1
env

sh
env

exit

PS1="$ "

Mettre en évidence en créant un ou deux shell (le nombre de shell est visualisable par
ps) qu'un processus fils ne peut pas modifier une variable du processus père et qu'en cas
d'homonymie la valeur est celle qui correspond à sa définition la plus locale.

Si f est un fichier de commande, la commande f va provoquer la création d'un shell


fils qui va interpréter le contenu de f.
En Bourne-shell
Si on veut éviter la création de ce shell fils il faut faire précéder la commande par un
point ( . f).

IMT Lille Douai – CERI numérique – JFC & JPV


- 30 -

En déduire une version de cd qui en plus de son action normale donne au prompt
l'allure habituelle du prompt du DOS (avec option $p$g). Pour quelles raisons faut-il
pointer cd? (Rem 1: on ne peut pas passer d'arguments à une commande pointée, le nom du
répertoire devra donc être saisi de façon interactive avec read; Rem 2: utiliser test (ou la
notation […]) pour tester l'existence du répertoire; Rem 3: éventuellement effectuer, pour
plus de commodité, au préalable PATH="${HOME}:$PATH", si mycd est défini dans
$HOME

Exemple :
$ pwd
/usr/usr1
$ . mycd
Nom du repertoire ? ..
/usr > . mycd
Nom du repertoire ? usr1
/usr/usr1 > . mycd
Nom du repertoire ? toto
Repertoire inexistant!
/usr/usr1 >

Analyser et conclure.

/usr/usr1 > pwd


/usr/usr1
/usr/usr1 > sh
/usr/usr1 > . mycd
Nom du repertoire ? ..
/usr > pwd
/usr
/usr > exit
/usr/usr1 > pwd
/usr/usr1
/usr/usr1 >

IMT Lille Douai – CERI numérique – JFC & JPV


- 31 -

Interruptions-Signaux
La commande trap permet de déclencher l'exécution d'une commande sur la
réception d'un signal.
Sa syntaxe est : trap commandes liste d'interruptions.
Ainsi la ligne :
trap 'echo signal 2 bien reçu !; exit 1' 2
permet au processus d'afficher "Signal 2 bien reçu", et de se terminer, sur la
réception de ce signal.
Le signal 2 (resp. 3) est envoyé au processus associé au terminal lorsque l'utilisateur
appuie sur ^C (break) ou ^D (resp. ^* ou ^/; création d'un fichier core dans ce cas))
Le signal 0 est associé à la terminaison du shell. Le signal 9 ne peut-être ni empêché,
ni ignoré : il provoque la destruction du processus (SIGKILL). Le signal 10 est provoqué
par la terminaison d'un processus fils.
Il est possible d'envoyer un signal de numéro n au processus identifié par son PID par
la commande kill:
kill -n PID
Attention : la commande kill permet donc d’envoyer un signal quelconque, pas
nécessairement le signal 9 (SIGKILL).
La commande trap est exécutée une première fois par le shell; puis les commandes
passées en argument sont exécutées lors de l'arrivée du signal correspondant. Il vaut donc
mieux protéger ces commandes par des quotes pour éviter une expansion des variables trop
précoces.

Ecrire un programme qui affiche, sur réception d'un signal, la phrase suivante:
"Signal reçu à 15:56:07". Contrôler si le temps indiqué correspond approximativement à
celui de l'émission du signal (on suppose que le programme lui-même est une boucle
suffisamment longue, infinie par exemple)

Modifier le programme précédent de façon à ce que le temps indiqué corresponde


approximativement à celui du lancement du programme.

IMT Lille Douai – CERI numérique – JFC & JPV


- 32 -

Ecrire un programme qui, lancé en arrière plan, affichera "Qu'UNIX soit avec vous..."
lors de la déconnexion

Exercices supplémentaires optionnels


1) Ecrire une commande (mymv) de renommage interactif des fichiers d'un répertoire
(voir la commande rm -i * pour le type de fonctionnement).
2) idem en indiquant à l'utilisateur s'il s'agit d'un fichier ou d'un répertoire.
3) Ecrire une commande (mycp) de recopie complète d'une arborescence (il est
possible d'invoquer une commande de façon récursive dans un shell-script).
4) Ecrire la commande inverse (myminmaj).
5) Ecrire la commande (myattrib) qui admet un nom de fichier comme paramètre et
qui détermine le ou les répertoires contenant ce fichier (utiliser find)
6) Ecrire une commande avec option qui sélectionne les fichiers de type texte
présents dans le répertoire courant:
-a : tous les fichiers de type texte
-c : les sources C uniquement
-s : les shell-scripts
-e : les fichiers contenant du texte de langue anglaise
-d : les répertoires
-x : les exécutables
Ces options doivent être combinables:
-cs : shell-scripts+C, de même pour -xc, -ce etc...
7)
a) Ecrire un programme agrégeant en un seul fichier plusieurs fichiers. Ex:
si f1 contient bonjour; si f2 contient salut alors agreg f? > gros génère le fichier gros
dont le contenu correspond à ce qui suit:
$ cat gros
Fichier f1
bonjour
Fichier f2
salut
$

IMT Lille Douai – CERI numérique – JFC & JPV


- 33 -

b) même question, mais gros contient maintenant:


$ cat gros
echo 'bonjour' >f1
echo 'salut' >f2
$

IMT Lille Douai – CERI numérique – JFC & JPV


- 34 -

Annexes

Commandes de base du SGF


man commande Affiche la page de manuel de la commande
cd rep Positionne le répertoire courant à rep
cd Positionne le répertoire courant au homedir
pwd Affiche le répertoire courant
ls Liste les noms des fichiers du répertoire courant
ls fichiers Liste seulement les fichiers nommés
ls -t Liste en ordre chronologique de mise à jour
ls -l Liste avec plus d'informations (format long)
ls -u Liste en ordre chronologique d'utilisation
ls -r Liste en ordre inverse
ls -a Liste tous les fichiers, notamment les fichiers cachés
cp ficl fic2 Copie de ficl sur fic2;fic2 est détruit s'il existe
mv ficl fic2 Change ficl en fic2; fic2 est détruit s'il existe
rm fichiers Détruit les fichiers nommés
vi fichier Edition defichier
cat fichiers Affiche le contenu des fichiers
more fichiers Affiche le contenu des fichiers avec pause par page écran
wc fichiers Compte les lignes, les mots et les caractères des fichiers
wc -l fichiers Compte seulement les lignes des fichiers
grep exp fichiers Affiche les lignes contenant exp dans les fichiers
grep -v exp fic Affiche les lignes ne contenant pas exp dans les fichiers
sort fichiers Trie les lignes des fichiers en ordre alphabétique
head fichier Affiche les 10 premières lignes du fichier
head -n fichier Affiche les n premières lignes du fichier
tail fichier Affiche les 10 dernières lignes du fichier
tail -n fichier Affiche les n dernières lignes du fichier
tail +n fichier Affiche fichier à partir de la ligne n
cmp fic1 fic2 Affiche le lieu de la première différence
diff ficl fic2 Affiche toutes les différences

IMT Lille Douai – CERI numérique – JFC & JPV


- 35 -

Répertoires usuels
/ racine du système de gestion de fichier
/bin programmes essentiels sous forme exécutable
/sbin programmes essentiels réservés à l’administrateur
/dev fichiers spéciaux périphériques
/etc principaux fichiers de configuration (passwd, etc.)
/etc/rc.d fichiers de démarrage (dépend de la distribution Unix)
/lib bibliothèques principales du système
/tmp fichiers temporaires
/boot forme exécutable du système d'exploitation (noyau)
/mnt arborescence des points de montage (cdrom, clés USB, etc.)
/usr arborescence dite « utilisateurs »
/usr/bin binaires utilisateurs: troff, etc.
/usr/sbin binaires utilisateurs habituellement réservé à l’administrateur
/usr/games jeux
/usr/include fichiers en-tête des programmes C : stdio.h, math.h, etc.
/usr/include/sys fichiers en-tête système pour C : inode.h,...
/usr/lib autres bibliothèques liées aux programmes utilisateurs
/usr/man pages de manuels
/usr/man/man 1 section 1 du manuel
/usr/src code source des utilitaires et bibliothèques
/usr/local arborescence locale (programmes installés par compilation)
/var arborescence de fichiers dits « variables »
/var/log répertoire des fichiers de logs (journaux)
/var/spool répertoire des programmes de communication
/var/spool/lpd répertoire temporaire de I'imprimante (en liaison directe)
/var/spool/mail boîtes aux lettres locales
/home répertoires personnels
/home/user répertoire personnel de l’utilisateur « user »

IMT Lille Douai – CERI numérique – JFC & JPV


- 36 -

Caractères et expressions génériques du shell

Caractères génériques
> prog > fichier : dirige la sortie standard de prog vers fichier
>> prog >> fichier : ajoute la sortie standard de prog à fichier
< prog < fichier : prend fichier comme entrée standard de prog
| p1|p2 : connecte la sortie standard de p1 à I'entrée standard de p2
<<str 1'entrée standard suit jusqu'à l'apparition de str dans le flot d'entrée
* remplace n'importe quelle suite de caractères dans un nom de fichier
? remplace un seul caractère dans un nom de fichier
[abc] remplace un seul caractère parmi abc dans un nom de fichier
[a-z] remplace un seul caractère parmi a jusqu’à z dans un nom de fichier
; terminateur de commande : p1;p2 fait pl puis p2
& prog & : lance prog en tâche de fond et rend la main au shell
( ... ) exécute les commandes ... dans un shell fils
$1, $2... $0 ... $9 sont remplacés par les arguments du fichier shell
$var valeur de la variable var du shell
${var} valeur de la variable var du shell pour éviter des confusions lors d'une
concaténation avec du texte.
\ \c prend littéralement le caractère c (sans interprétation)
' ... ' prend ... littéralement`(sans interprétation)
" ... " prend... littéralement après interprétation de $, `... ` et \
`...` exécute les commandes dans ...; le résultat remplace `...`
# débute une ligne de commentaire
var=valeur assignation d'une valeur à la variable var
p1 && p2 exécute pl; s'il n'y a pas d'erreur, exécute p2 (ET logique)
p1 || p2 exécute pl; s'il y a une erreur, exécute p2 (OU logique)

Redirections du shell
>fichier dirige la sortie standard vers fichier
>>fichier ajoute la sortie standard à fichier
<fichier prend I'entrée standard depuis fichier
pl | p2 connecte la sortie standard de pl a I'entrée de p2
^ ancien synonyme de |
n>fichier dirige la sortie du descripteur n vers fichier
n>>fichier ajoute la sortie du descripteur n à fichier
n>&m fusionne la sortie du descripteur n à celle de m

IMT Lille Douai – CERI numérique – JFC & JPV


- 37 -

n<&m fusionne I'entrée du descripteur n avec celle de m:


<<s prend I'entrée a la suite jusqu'à rencontrer s en début de ligne.
Interprétation de $, `...` ,et \
<<'s' même chose que ci-dessus mais sans interprétation.

Variables prédéfinies du shell


$# Le nombre d'arguments passés en ligne de commande
$* Tous les arguments
$@ Semblable à $*
$- Les options passées en ligne de commande
$? Valeur de retour de la dernière commande exécutée
$$ N° de processus du shell
$! N° de processus de la dernière commande lancée par &
$HOME Argument par défaut de la commande cd
$IFS Liste des caractères qui séparent les mots dans les arguments
$MAIL Fichier qui déclenche "you have mail" lors d'une modification
$PATH Liste des répertoires pour rechercher les commandes
$PS 1 Caractère d'appel; par défaut '$ '
$PS2 Caractère d'appel des lignes suites; par défaut '> '

Expressions génériques du shell


* Désigne n'importe quelle chaîne. même la chaîne vide.
? Désigne n'importe quel caractère unique
[abc] Désigne tout caractère parmi abc
[a-d0-3] est équivalent à [abcd0123]
' ... ' prend ... littéralement`(sans interprétation)
" ... " prend... littéralement après interprétation de $, `... ` et \
`...` exécute les commandes dans ...; le résultat remplace `...`
\c Désigne le caractère c littéralement
a|b Dans un case seulement; désigne a ou b.
/ Dans un nom de fichier, désigne un / explicite;
/ Dans un case comme un caractère ordinaire
/ Comme premier caract. d'un nom de fichier, désigne un chemin absolu.

Evaluation des variables du shell


$var valeur de var; rien si var est indéfinie
${var} même chose; utile pour éviter des confusions

IMT Lille Douai – CERI numérique – JFC & JPV


- 38 -

${var-val} valeur de var si définie, val dans le cas contraire;


$var est inchangée
${var=val} valeur de var si définie, val dans le cas contraire;
$var devient val si indéfinie
${var?mes} valeurde var si définie; impression de mes sinon;
le shell se termine. Si mes est vide, impression de :
var: parameter not set
${var+val} val si var est définie, rien sinon.

Les interruptions
0 fin du shell (toute raison, même fin de fichier)
1 raccrochage du téléphone
2 touche DEL
3 fin par ctl-\; crée la production d'une image mémoire
9 destruction (ne peut être ni empêchée ni ignorée)
15 terminaison: interruption par défaut de par défaut de kill(l)

Refcard Vi
Voir page suivante.

IMT Lille Douai – CERI numérique – JFC & JPV


Carte de référence de l’éditeur vi Copie Expressions Régulières
Valvassori Moı̈se – Revision : 1.7 Comme les suppressions, la plupart des commandes de n’importe quel caratère . (point)
copie sont effectuées en tapant y suivie d’une commande de répéter zéro ou plus *
déplacement. Par exemple, y$ copie le texte jusqu’à le fin de ensemble de caractère [...]
Modes
la ligne. tous caractères / ensemble [^ ...]
vi possède deux modes : le mode commande et le mode Deux autres commande de copie sont : début, fin de ligne ^ , $
insertion. L’éditeur démarre en mode commande. Le mode la ligne yy début, fin de mot \< , \>
insertion commence lorsqu’on rentre une commande d’inser- la ligne :y groupement \(...\)
tion ou de changement. La touche [esc] permet de revenir contenu du n ième groupe \n
en mode commande. Changement de Texte
La plupart des commandes s’exécutent pendant la sai- Les commandes de changement de texte sont des com- Répéter
sie sauf celle qui sont précédées par deux points (:). Ces mandes de suppression de texte qui laissent l’éditeur dans le Presque toutes les commandes peuvent être précédé par
dernières s’exécutent après avoir appuyé sur la touche mode insertion. Elles sont effectuées en tapant c suivi d’un un nombre qui spécifie le nombre de fois que la commande
[entrée]. déplacement. Par exemple cw changes un mot. est effectuée. Par exemple 5dw supprimera 5 mots et 3fe
D’autre commandes : déplacera le curseur jusqu’à la troisième occurrence de la
Quitter jusqu’à la fin de la ligne C lettre e. Même les insertions peuvent être répétées avec cette
sortir et sauver :x la ligne cc méthode. Pratique pour insérer la même ligne 100 fois.
sortir (si pas de changement) :q Coller du texte Intervalles
sortir (sans sauver les fichiers modifés) :q ! coller après la position ou la ligne p Les intervalles peuvent précéder le plupart des com-
coller avant la position ou la ligne P mandes ¡¡deux points¿¿ et elles seront exécuter sur l’in-
Insertion de Texte
insérer avant le curseur, avant la ligne i , I Buffers tervalle. Par exemple :3,7d supprimera les lignes de 3
ajouter après le curseur, après la ligne a , A Les buffers nommées peuvent être spécifiés avant chaque à 7. Les intervalles sont communément combinés avec la
ouvrir une nouvelle ligne après, avant o , O commande de suppression, changement, copie ou collage. Le commandes :s pour faire un remplacement sur certaines
remplacer un caractère, plusieurs r , R préfixe général est de la forme "c oú c est une lettre minus- lignes. :.,$s/.../.../g fait un remplacement de la ligne
cule. Par exemple, "adw supprime un mot dans le buffer courante à la fin du fichier.
Déplacement lignes n à m :n,m
a. On peut le remettre dans le texte avec la commande de
ligne courante :.
gauche, bas, haut, droite h , j , k , l collage appropriée, par exemple "ap.
dernière ligne :$
mot suivant, ¡¡blanc¿¿ suivant w , W
début du mot, début du ¡¡blanc¿¿ b , B
Marqueur marqueur c :’c
Les marqueurs nommés peuvent être placés sur n’im- toutes les lignes :%
fin du mot, fin du ¡¡blanc¿¿ e , E
porte qu’elle ligne d’un fichier. N’importe quelle lettre mi- toutes les lignes contenant pattern :g/pattern /
phrase précédente, suivante ( , )
paragraphe précédent, suivant { , } nuscule peut être un nom de marqueur. Les marqueurs Fichiers
début, fin de la ligne 0, $ peuvent aussi être utilisés comme limites d’un intervalle. sauver (fichier courant si pas de nom) :w fichier
début, fin du fichier 1G, G mettre le marqueur c sur la ligne mc insère un fichier :r fichier
n ième ligne n G ou :n aller au marqueur c ‘c fichier suivant, précédant :n , :p
avancer, reculer jusqu’au caractère c fc , Fc aller au premier caractère non ¡¡blanc¿¿ après c ’c éditer le fichier :e fichier
haut, milieu, bas de l’écran H , M , L Chercher remplace la ligne par le programme ! !prg
chercher en avant /cha^
ıne Divers
Suppression de Texte chercher en avant ?cha^
ıne alterner majuscule/minuscule ~
La plupart des commandes de suppression sont effectuées répéter la recherche dans la même direction n oindre les lignes J
en tapant d suivie d’un déplacement. Par exemple, dw sup- répéter la recherche dans la direction opposé N répéter la dernière commande de changement .
prime un mot. annuler changement, toute la ligne u , U
Remplacer
D’autres commandes : Copyright c 2003 Valvassori Moı̈se <djedi@ai.univ-paris8.fr>.
caractère à droite, gauche x , X Cherche le pattern et le remplace par la chaı̂ne. Permission est accordée de copier, distribuer et/ou modifier ce do-
cument selon les termes de la Licence de Documentation Libre GNU
jusqu’à la fin de la ligne D chercher/remplacer :s/pattern /cha^ıne /flags (GNU Free Documentation License), version 1.1 ou toute version
ultérieure publiée par la Free Software Foundation ; sans Sections In-
la ligne dd flags : sur chaque ligne, confirmer g , c variables ; sans Textes de Première de Couverture, et sans Textes de
Quatrième de Couverture.
la ligne :d répéter le dernier :s &

Vous aimerez peut-être aussi