Académique Documents
Professionnel Documents
Culture Documents
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-
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)
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
vi essai1.txt
cat essai1.txt
touch essai1.txt
ls
ls -ld
ls -C
ls -R
ls *.out
ls c*
mv nom /tmp/nouveau_nom
rm -ri
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]
sort text1
sort -r 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
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 text1
ls -l >text3
<text3 sort
<text3 sort -r
cat zzzz (génére une erreur, le fichier zzzz n'existe pas. Voir la suite pour
comprendre...)
cat zzzz >text5 (idem)
cat text5
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
Les variables
Essayer et commenter:
set
echo PS1
echo $PS1
echo $PS1
PS1=$
echo $HOME
echo $PATH
echo $LOGNAME
echo $1
echo $2
set `date`
echo $1
echo $2
echo $3
echo $*
echo $#
echo $1
echo $2
echo $3
echo $4
echo $*
echo $#
toto=titi
set
unset toto
set
Structures de contrôle
set `date`
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 (text3) contenant la phrase echo bonjour les amis, puis essayer:
file text3
Les commandes head et tail permettent d'avoir rapidement une idée du contenu d'un
fichier texte. Essayer :
head text4
head -5 text4
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
ls -l text1
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).
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.
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.
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-...).
Exécuter et interpréter:
date >/dev/ttyn
Exécuter et interpréter:
date >`tty`
cat /dev/null
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
cat text2
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
)&
Détruire tous les processus courant (sauf votre shell bien sûr).
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
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)
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))
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.
Créer, avec vi, le fichier de commande (numproc) qui affiche le nombre de processus
actifs.
mycal
==>
Aout 1991
D L Ma Me J V S
1 2 3
4 5 etc...
Passage de paramètres
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
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.
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.
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)
Ecrire un programme qui, lancé en arrière plan, affichera "Qu'UNIX soit avec vous..."
lors de la déconnexion
Annexes
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 »
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
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.