Commandes Unix essentielles et processus
Commandes Unix essentielles et processus
Département Informatique
Cours 3 d’Unix
Cyril Pain-Barre
Année 2003-2004
Sommaire
Utilisation :
cat {référence}
Elle ne fait qu’écrire sur sa sortie standard le contenu des fichiers qui lui sont passés en
arguments. Ils apparaissent ainsi concaténés à l’écran (collés les uns à la suite des autres).
Sans argument, cat se contente d’écrire sur sa sortie standard ce qu’elle lit sur son entrée
standard, jusqu’à rencontrer la marque de fin de fichiers (Ctrl d).
Pour créer un fichier avec cat, il faut rediriger sa sortie standard. Si en plus aucun
argument n’est spécifié, c’est ce qui est tapé au clavier qui est écrit dans le fichier.
Exemples
[cpb@duo tpunix]$ cat [Link]
#include <iostream>
} // main()
Ctrl d
sans argument, cat écrit sur sa sortie standard (ici, le fichier [Link]) ce
qu’elle lit sur son entrée standard (ici le clavier).
Utilisation :
wc [-cwl] {référence}
Effectue le comptage des caractères (si –c positionnée), des mots (si –w) et des lignes (si
-l) de chacun des fichiers passés en arguments ou, à défaut, ce qu’elle lit sur son entrée
standard jusqu’à rencontrer Ctrl d (la marque de fin de fichier). Si aucune option n’est
spécifiée, wc effectue les trois comptages.
Exemples
[cpb@duo tpunix]$ wc -l /etc/passwd
258 /etc/passwd
Utilisation :
Exemples
[homer@duo ~]$ ls -ld Public mbox [Link] /bin/tcsh /dev/sda1
-rwxr-xr-x 1 root root 258288 mar 7 2000 /bin/tcsh
brw-rw---- 1 root disk 8, 1 mai 5 1998 /dev/sda1
drwx------ 5 cpb prof 1024 sep 13 07:05 Public
-rw-r--r-- 1 cpb prof 1063 sep 19 01:06 [Link]
-rw------- 1 cpb prof 551 sep 5 11:35 mbox
[homer@duo ~]$ file Public mbox [Link] /dev/sda1 /bin/tcsh
Public: directory
mbox: English text
[Link]: ASCII C program text
/dev/sda1: block special (8/1)
/bin/tcsh: ELF 32-bit LSB executable, Intel 80386, version 1, dynamically
linked (uses shared libs), stripped
file indique que le premier fichier est un répertoire, le second est un fichier
contenant du texte en anglais, le troisième est le source d’un programme C++, le
quatrième est (une partition d’)un disque dur. Le dernier fichier est un fichier
binaire exécutable.
Utilisation
Les arguments de expr doivent être séparés par des blancs. opérateur peut être soit un
opérateur arithmétique soit de comparaison.
Opérateurs arithmétiques :
Si l’opérateur est arithmétique, les opérandes doivent être des entiers (positifs ou
négatifs). Si leur signe est spécifié, il doit être collé aux chiffres. Les opérateurs
arithmétiques possibles sont :
+ addition
- soustraction
* multiplication
/ division
Opérateurs de comparaison :
= égal
!= différent
Exemples
Opérations arithmétiques :
[cpb@duo ~]$ expr 2 + 3
5
[cpb@duo ~]$ expr 2 \* 3
6
[cpb@duo ~]$ expr 2 - -3
5
[cpb@duo ~]$ expr 7 % -3
1
Comparaisons :
[cpb@duo ~]$ expr 2 \< 3
1
[cpb@duo ~]$ expr 2 \> 3
0
[cpb@duo ~]$ expr toto = tutu
0
[cpb@duo ~]$ expr toto \>= tutu
0
[cpb@duo ~]$ expr toto \<= tutu
1
Utilisation
Le premier argument commençant par un des caractères ‘–’, ‘(’, ‘)’, ‘!’ ou ‘,’ marque le
début de expression. Ce qui précède est considéré comme des réf_rép. Si aucune réf_rép n’est
spécifiée, le répertoire de travail (point) est pris par défaut.
expression est toujours évaluée de gauche à droite. Elle est composée d’une suite de
critères (séparés par des espaces), dont certains sont mentionnés ci-après. Son évaluation
s’arrête (pour le fichier examiné) dès qu’un critère n’est pas satisfait (faux) ou lorsque tous les
critères ont été vérifiés.
Afin de pouvoir exprimer une expression complexe, il est possible d’utiliser le point
d’exclamation pour demander la négation du critère (ou de l’expression entre parenthèses) qui
le suit (après un séparateur), l’opérateur logique OU (noté –o), ainsi que les parenthèses pour
grouper une expression complexe. Lorsqu’un OU est présent, l’expression de droite n’est
évaluée que si celle de gauche est fausse. L’opérateur logique ET est implicite entre deux
critères mais peut aussi être exprimé avec –a.
Il est vivement conseillé d’utiliser les parenthèses afin d’éviter toute ambiguïté dans
l’expression.
-print
Ce critère est toujours vrai. Il a pour effet de provoquer l’affichage de la référence
relative du fichier en cours d’analyse. Cette référence est relative au répertoire racine
de l’arborescence explorée. S’il n’est pas indiqué, ce critère est toujours rajouté pour
être évalué en dernier, sauf si le critère –exec ou –ok a été évalué ;
-type type
vrai si et seulement si le fichier en cours d’analyse est du type type, où type peut
être :
f pour fichier ordinaire
d pour fichier répertoire
-user nom
vrai ssi nom est le propriétaire du fichier en cours d’analyse ;
-group groupe
vrai ssi groupe est le groupe du fichier ;
-name motif
vrai ssi le nom du fichier (et non pas sa référence) correspond au motif. La
description du motif est la même que pour le shell. Mais il faut protéger les caractères
spéciaux pour ne pas qu’ils soient interprétés par le shell ;
-newer référence
vrai ssi le fichier est plus récent que le fichier référence ;
-mtime [+|–]n
vrai ssi la dernière modification du fichier remonte à plus de (+), moins de (–), ou
exactement n jours. Attention, le | entre le + et le – marque une alternative entre ces
deux caractères, il n’est pas à écrire ;
-atime [+|–]n
vrai ssi le dernier accès au fichier a eu lieu il y a plus de (+), moins de (–), ou
exactement n jours ;
-exec commande ;
vrai ssi commande retourne une valeur vraie1. commande est donc exécutée. Elle
peut comporter des options et des arguments. Le point virgule indique où commande
se termine. Il doit être protégé car c’est un caractère spécial du shell. Dans
commande, on peut utiliser l’expression {} qui sera remplacée par une référence du
fichier en cours d’analyse. Une fois de plus, les accolades sont des caractères
spéciaux du shell qu’il faut donc protéger ;
-ok commande ;
même chose que –exec mais un message demande s’il faut exécuter la commande
(réponse y ou Y) ou pas (dans ce cas –ok est faux).
1
La valeur de retour d’une commande sera vue dans « Code de retour des commandes », page Erreur ! Signet
non défini..
Exemples
La commande suivante recherche dans l’arborescence de /var les fichiers ordinaires dont
le nom comporte cpb, et affiche leur référence :
[cpb@duo ~]$ find /var –type f –name \*cpb\* -print
find: /var/lib/nfs/sm: Permission non accordée
find: /var/lib/nfs/[Link]: Permission non accordée
find: /var/lib/pgsql: Permission non accordée
find: /var/lib/slocate: Permission non accordée
find: /var/log/samba: Permission non accordée
find: /var/log/squid: Permission non accordée
/var/spool/mail/cpb
find: /var/spool/at: Permission non accordée
find: /var/spool/cron: Permission non accordée
find: /var/spool/news/.xauth: Permission non accordée
find: /var/spool/squid: Permission non accordée
find: /var/spool/intercheck/infected: Permission non accordée
find: /var/gdm: Permission non accordée
toutes les lignes commençant par find: sont des messages d’erreur. Seule la ligne
/var/spool/mail/cpb indique un fichier correspondant aux critères.
Dans la commande précédente, le critère –print figure à la fin pour que l’affichage de la
référence des fichiers ne soit fait que s’ils vérifient les critères –type et –name. Si –print se
trouve ailleurs, cela change considérablement l’affichage, comme le montre l’exemple ci-
dessous (seules les premières lignes du résultat sont reportées sur ce document) :
[cpb@duo ~]$ find /var -print -type f -name \*cpb\*
/var
/var/tmp
/var/tmp/A8_6Cadre.[Link]
/var/tmp/[Link]
/var/tmp/[Link]
/var/tmp/[Link]
/var/tmp/[Link]
/var/tmp/[Link]
/var/lib
/var/lib/rpm
/var/lib/rpm/[Link]
/var/lib/rpm/[Link]
/var/lib/rpm/[Link]
/var/lib/rpm/[Link]
/var/lib/rpm/[Link]
/var/lib/rpm/[Link]
...etc.
Mieux encore, en remplaçant –print par –ok, find peut demander s’il faut imprimer
chaque fichier trouvé sur l’imprimante de la salle A. Le critère –exec est alors utilisé pour
afficher que l’impression du fichier est lancée. La ligne de commandes devenant grande, elle
est présentée sur deux lignes :
[cpb@duo ~/tp]$ find -type f \( -name '*.ad[bs]' -o -name '*.squ' \)
-ok lpr -PA \{\} \; -exec echo "Impression envoyée" \;
< lpr ... ./tpada/p_rationnels_g.ads > ? y
Impression envoyée
< lpr ... ./tpada/p_rationnels_g-[Link] > ? n
< lpr ... ./tpada/p_rationnels_g-[Link] > ? n
< lpr ... ./tpada/tscl_rationnels.adb > ? y
Impression envoyée
< lpr ... ./tpada/ts_rationnels.[Link] > ? n
Le terminal d’un utilisateur est un fichier spécial, dans lequel il est possible d’écrire
(selon ses permissions). Tout ce qui y est écrit est affiché sur la fenêtre utilisant ce
(fichier) terminal.
Exemples
[cpb@duo ~]$ tty
/dev/pts/1
[cpb@duo ~]$ ls -l /dev/pts/1
crw------- 1 cpb tty 136, 1 sep 19 05:42 /dev/pts/1
on remarque le c indiquant un fichier spécial, que cpb en est le propriétaire et
possède les droits de lecture et d’écriture.
[cpb@duo ~]$ echo Salut > /dev/pts/1
exécuté dans une fenêtre quelconque, cela a pour effet d’écrire Salut dans la
fenêtre où a été tapée tty.
Il existe un terminal fictif /dev/null, sur lequel tout le monde a les droits de
lecture et d’écriture, mais qui ne représente rien : tout ce qui est écrit dedans est perdu
et rien ne peut y être lu. Ce fichier est principalement utilisé comme destination de la
redirection d’une sortie d’une commande afin de se débarrasser des informations
(inutiles) qu’elle y écrit.
Exemple
[cpb@duo ~]$ echo Salut > /dev/null
n’importe qui peut exécuter cette commande qui n’a aucun effet car Salut n’est
écrit nulle part.
II. Processus
II.1. Introduction
Pour rester très simple, un processus est ce que le système crée afin d’exécuter un
programme. Il possède un environnement qui comporte le code exécutable, la mémoire
allouée par le système, les descripteurs des fichiers utilisés, la pile d’exécution…
Un processus est toujours lancé par un autre, appelé son processus père. Exception faite
du processus init, portant le numéro 1, qui est le patriarche de tous car c’est le noyau (le
cœur) du système Unix. Un processus finit généralement par mourir, notamment lorsqu’il a
terminé l’exécution de son code (programme).
2
Il est possible qu’un processus ne soit pas propriété de l’utilisateur qui l’a lancé et/ou n’ait pas son groupe.
C’est le cas de certains programmes qui ont besoin, pour réaliser leur travail, de garder comme propriétaire et/ou
groupe, ceux du fichier exécutable. Mais ceci est une autre histoire…
3
Certaines commandes comme cd ou pwd sont internes à l’interpréteur de commandes qui les exécute lui-
même. Ce ne sont donc pas des fichiers exécutables.
Ce comportement dit séquentiel ou synchrone est exactement celui que l’on attend
généralement, car on n’aimerait pas voir le prompt s’afficher en plein milieu de ce qu’affiche
le processus de notre commande, et ne plus savoir ensuite si il est terminé.
Cependant, il y a des processus dont on ne veut pas attendre la fin pour continuer à taper
des commandes. C’est le cas par exemple des applications graphiques (qui ouvrent au moins
une fenêtre pour dialoguer), ou des programmes ne nécessitant aucune donnée en provenance
de l’utilisateur.
Exemples
[cpb@duo ~]$ aterm &
[1] 4767
a pour effet de lancer en parallèle la commande cmd1 –o1 arg1 < ref1 et de lancer
en séquentiel (en attendant sa fin), la commande cmd2 –o2 arg2. On aurait pu lancer cette
dernière en parallèle en tapant :
[cpb@duo ~]$ cmd1 –o1 arg1 < ref1 & cmd2 –o2 arg2 &
Utilisation :
jobs [-l]
Exemples
[alfred@pi ~]$ aterm &
[1] 3626
[alfred@pi ~]$ find / -name truc > [Link] &
[2] 3673
[alfred@pi ~]$ jobs
[1] + Running aterm
[2] - Running find / -name truc > [Link]
[alfred@pi ~]$ jobs -l
[1] + 3626 Running aterm
[2] - 3673 Running find / -name truc > [Link]
Utilisation
ps [x][a][l|u]
Attention, il n’y a pas de tiret devant les options. Sans option, ps affiche simplement les
informations sur les processus de l’utilisateur qui sont rattachés au terminal (fenêtre) sur
lequel elle a été lancée. Avec l’option x, tous les processus de l’utilisateur sont affichés même
4
Remarquons qu’un pipeline est constitué d’un ensemble de processus lancés en parallèle et communicant entre
eux.
5
C’est aussi une commande interne de csh, sh, bash, etc.
ceux qui ne sont pas rattachés au terminal. L’option a demande aussi l’affichage des
processus n’appartenant pas à l’utilisateur (rattachés au terminal ou pas, selon x). L’option l
demande un affichage d’informations plus détaillées (en particulier, la colonne PPID indique
le numéro du processus père du processus détaillé par la ligne correspondante). Enfin,
l’option u (inutilisable avec l’option l) demande un affichage où figure le nom du propriétaire
du processus (mais pas le PPID).
Exemples
[cpb@duo ~]$ ps
PID TTY TIME CMD
4722 pts/8 00:00:00 tcsh
4790 pts/8 00:00:00 ps
Les seuls processus actifs sur la fenêtre sont tcsh6 et ps (qui va mourir immédiatement
après avoir écrit cette liste). En rajoutant /dev/ devant l’élément TTY, on obtient la
référence absolue du (fichier) terminal auquel le processus est rattaché.
[cpb@duo ~]$ aterm &
[1] 4767
6
Le nom qu’il porte au démarrage est différent selon les versions. Cela tend à être tcsh (sur Red Hat 7.2) mais
c’était –csh sur la Red Hat 6.2.
On remarque qu’un tcsh (pid 4768) a été créé par aterm (la fenêtre). Il dispose d’un
nouveau terminal qui est le fichier /dev/pts/10.
Utilisation :
pid est le numéro d’un processus à qui on adresse le signal numéro n (n peut être aussi un
identificateur de signal, cf. ci-dessous). À la place du numéro de processus, on peut indiquer
le numéro de job en utilisant %job. Mais dans ce cas, le job doit être un fils du shell où est tapé
la commande kill.
Il y a 39 signaux différents sur la Red Hat 6.2. L’option –l permet d’en obtenir une liste.
Chacun a une signification. Pour l’instant seuls les trois suivants nous intéressent :
2 ou INT signal plus brutal demandant un arrêt immédiat. C’est celui généralement
provoqué par l’appui sur les touches Ctrl c. À utiliser si le précédent n’a
pas marché.
9 ou KILL signal le plus violent. Il provoque la mort sans condition des processus
atteints. À utiliser en dernier recours.
Si -n n’est pas spécifié (ni l’option -l), le signal pris par défaut est TERM.
Exemples
[cpb@duo ~]$ tcsh
III.1. Présentation
Les expressions régulières est un terme désignant l’expression de motifs de chaînes de
caractères. Ceci, dans l’esprit des motifs de noms de fichiers, en beaucoup plus puissant. Elles
servent à la recherche et/ou au remplacement de chaînes dans des lignes de texte et sont
reconnues par de nombreux utilitaires d’Unix tels que vi, grep, more, less, man, sed, …
Une expression régulière est formée de motifs exprimés par des suites de caractères.
Certains caractères sont spéciaux dans une expression régulière, tels que ^, ., $, [, ], et *.
Ce sont aussi des caractères spéciaux pour tcsh mais oublions tcsh pour l’instant et
leur signification dans celui-ci (bien que de nombreuses similarités seront constatées).
Les caractères spéciaux ont une signification différente de leur symbole. Pour qu’un
caractère spécial soit interprété littéralement (comme son propre symbole), il faut le faire
précéder d’un backslash ‘\’.
Les caractères suivants sont normaux mais acquièrent une signification spéciale s’ils sont
précédés d’un backslash : ?, +, {, }, (, ) et |. Pour que le backslash soit reconnu comme
lui-même, il suffit de le doubler. Tous les autres caractères ne représentent qu’eux-mêmes. En
particulier, tout espace présent dans l’expression régulière doit figurer aussi dans la chaîne.
exp_reg : := [^]motif[modificateur]{motif[modificateur]}[$]
motif est une description incomplète d’une partie d’une chaîne. Si ^ est présent en
début du premier motif, alors la chaîne doit se trouver au début d’une ligne. Si $ est
présent en fin du dernier motif, elle doit se trouver à la fin de la ligne ;
exp_reg : := exp_reg\|exp_reg
motif : := .
motif : := [[^]ensemble[[:space:]]]
c’est la même définition d’un ensemble pour les motifs de noms de fichiers.
Cependant, on peut y faire figurer [:space:] (ces crochets sont à taper) qui
représente les caractères d’espacement (espace, tabulations,…). Les caractères
spéciaux perdent leur signification dans l’expression de ensemble ;
motif : := caractère_normal
motif : := \(exp_reg\)
motif : := \n
Les modificateurs
Ils permettent de fixer des contraintes sur le nombre d’apparitions du motif (ou donc de
l’expression régulière entre parenthèses) qui le précède. Un modificateur s’exprime selon la
syntaxe suivante :
modificateur : := *
modificateur : := \+
le motif précédent doit apparaître au moins une fois (et peut être plus) ;
modificateur : := \?
Les modificateurs suivants ne sont pas toujours reconnus par l’éditeur vi (cela dépend de la
version) mais le sont par grep :
modificateur : := \{n[,m]\}
modificateur : := \{n,\}
Ce sont les chaînes les plus grandes correspondant au motif modifié qui seront
retenues. Par exemple, le motif a* aura pour correspondance aaa dans la chaîne
bbbaaaccc et non pas la chaîne vide (à méditer).
:[n[,m]]s/chaîne1/chaîne2/[g]
En fait, chaîne1 peut être une expression régulière. De plus, on peut utiliser le motif \n
dans chaîne2 qui sera remplacé par la chaîne correspondant à la nième expression entre
parenthèses dans chaîne1.
Exemple
:1,$s/\(a*\)\(b*\)/\2\1
Utilisation
référence est une référence à un fichier ordinaire. Si aucune référence n’est spécifiée, grep
effectue la recherche sur les lignes lues sur son entrée standard. Sans option, les lignes
contenant une chaîne répondant à exp_reg sont imprimées. L’option –v inverse la recherche et
affiche celles ne contenant pas de chaîne correspondant à exp_reg. L’option –c fait
simplement afficher le nombre de lignes qui auraient été écrites. L’option –l permet de
n’afficher que les noms des fichiers dont au moins une ligne correspond à l’exp_reg. L’option
–n demande à ce que chaque ligne écrite soit précédée de son numéro d’apparition dans le
fichier. L’option –i demande de ne pas distinguer les majuscules et les minuscules. L’option
-w indique que exp_reg doit correspondre à un mot.
Exemples