Fmi Seu (1) - Copier
Fmi Seu (1) - Copier
Fmi Seu (1) - Copier
PDFelement
« Tout le monde peut réussir, la seule façon de faire un excellent travail est d’aimer
ce que vous faites. »
AVANT PROPOS :
Ce polycopie a pour objectifs de :
Douglas McIlroy, l'inventeur des tuyaux Unix (Unix pipes en anglais) et l’un des
fondateurs de la tradition d'Unix, résume la philosophie comme suit :
SOMMAIRE
I/ Quelques bonnes raisons pour se mettre à Unix. 01
II/ Description et caractéristiques d'Unix. 03
III/ Le démarrage. 04
IV/ Où trouver de l'information sur Unix? 05
V/ Tout faire avec et grâce aux fichiers. 05
VI/ Des éditeurs de textes et le contrôle de la ligne de commande. 06
VII/ Les principales commandes d'Unix. 09
VIII/ Faire Connaissance avec le Shell. 15
a. Introduction au Shell. 15
b. Mécanismes essentiels du Shell. 17
c. Quelques commandes Unix pour écrire des scripts. 18
d. L’interpréteur de commandes ou Shell bash. 20
e. Manipulation des variables. 22
f. Les structures de contrôles : 22
f.1 Les boucles conditionnelles while et until. 25
f.2 Le choix Case. 26
f.3 Le test if. 27
g.1 set. 30
g.3 exit. 32
Supprimer filigrane Wondershare
PDFelement
g.4 shift. 32
g.5 time. 32
g.6 Tableaux. 33
g.7 eval. 34
g.8 Fonctions. 34
a. Série d'exemples. 37
b. Caractéristiques de processus. 39
c. Processus exécutés en avant ou arrière-plan. 41
d. Ecriture de quelques scripts simples en Shell (bourne –shell).43
e. Ecriture de quelques scripts traduits en différents shell (bourne -
shell, korn –shell, C-shell, T-Cshell). 45
X/ Langage C sous Unix. 50
a. Rappel du langage C avec quelques exemples. 50
b. Traductions de quelques exemples du compilateur langage C
vers l’interpréteur Shell. 58
XI/ Conclusion. 63
XII/ Références. 64
Supprimer filigrane Wondershare
PDFelement
Une des principales difficultés d'Unix reste son abord par ligne de
commande, un peu démodé demandant un minimum d'investissement
avant de pouvoir faire la moindre tâche. Ce type d'interface frustre reste
pourtant inégalé en efficacité depuis 30 ans ! Par ailleurs, il existe depuis
plus de dix ans des interfaces graphiques comparables à ceux du système
Windows et maintenant les environnements graphiques sous Linux, par
exemple KDE, qui n'ont plus rien à envier à celui des systèmes Microsoft.
1
Supprimer filigrane Wondershare
PDFelement
2
Supprimer filigrane Wondershare
PDFelement
e. Interactif et batch.
Sur un système unix, on trouve deux types de personnes, celles qui vont utiliser
le système (user utilisateur) et celles qui vont l'administrer (root administrateur).
Les premières ont le droit d'exécuter certaines commandes propres à leur
environnement et leur travail, quelques commandes liées au système leur sont
3
Supprimer filigrane Wondershare
PDFelement
III/ Le démarrage.
Donc, vous voilà connecté à une machine Unix sous X (en fait X11-windows).
Sachez d'abord que vous êtes sous votre répertoire HOME. C'est un espace
disque qui vous appartient, à vous et à vous seul. Normalement vous pouvez
écrire et lire tous les fichiers qui s'y trouvent.
4
Supprimer filigrane Wondershare
PDFelement
Unix est convivial. Cependant Unix ne précise pas vraiment avec qui. »
– Steven King-
Chez UNIX, tout est fichier. Ça veut dire qu’un programme, une librairie, un
périphérique extérieur (disquette, disque, CDROM, imprimante) est vu par le
système comme un fichier. Pour l’utilisateur débutant, les implications de ce
principe sont peu importantes, mais cette unité de représentation fait d’UNIX un
système très sûr et très modulable.
5
Supprimer filigrane Wondershare
PDFelement
• un nom de fichier qui commence par un / est dit nom absolu, il est nommé
en partant de la racine et en descendant dans les répertoires suivants.
• un fichier qui ne commence pas par un / est dit nom relatif, il est
recherché à partir du répertoire courant.
• il n'y a pas de limitation sur le nom des fichiers (à part les caractères
spéciaux / ([%#$...) qu'il est préférable d'éviter!)
vi/emacs/xemacs/nedit
Le monde de l'édition est un monde encore plus conflictuel que celui des shells. Il
existe de multiples éditeurs sous Unix, mais deux majeurs s'affrontent depuis
1975 ! Vi d'un côté (standard Unix) et Emacs (domaine public, à installer) de
l'autre.
Chacun a ses propres avantages et défauts, aucun des deux n'est vraiment
simple au début.
Ceci dit, nedit est également disponible sur la plupart des machines et ne pose
aucun problème au débutant (sauf pour le trouver, il est peut être sous
6
Supprimer filigrane Wondershare
PDFelement
Remarque : pour basculer d’un mode à un autre on appuie toujours sur la touche
Esc du clavier (AZERTY OU QUERTY).
Commandes Fonctions
I basculement en mode insertion
A basculement en mode ajout
Cw modification du mot courant
Esc sortie du mode d'insertion/ajout/modification
concaténation de la ligne courante et de la
J
suivante
X effacement du caractère suivant
X effacement du caractère précédent
$ déplacement en fin de ligne
0 déplacement en début de ligne
Dd suppression de ligne et copie dans le buffer
Dw suppression de mot et copie dans le buffer
P copie du buffer sous la ligne courante
D effacement jusqu'à la fin de la ligne
. répétition de la dernière commande
U annulation de la dernière commande
H déplacement vers la gauche
L déplacement vers la droite
J déplacement vers le bas
K déplacement vers le haut
CTRL F déplacement sur la page suivante
CTRL B déplacement sur la page précédente
entrée dans le mode de commande pour les
:
commandes suivantes
w [fic] sauvegarde dans le/un fichier
Q sortie de vi
q! sortie sans sauvegarde
7
Supprimer filigrane Wondershare
PDFelement
8
Supprimer filigrane Wondershare
PDFelement
Tout ce que vous avez toujours voulu savoir sur Unix sans jamais oser le
demander.
-Vincent Lozano-2011
ls
Sous Unix, la commande la plus utilisée est, sans aucun doute, ls. Elle liste les
fichiers et répertoires de votre répertoire courant.
mkdir
Ma_machine>mkdir projet1
Ma_machine>mkdir -p projet2/src/new
cd
Ma_machine>cd bin
Ma_machine>cd bin/new
Ma_machine>cd ../../src
9
Supprimer filigrane Wondershare
PDFelement
cp
La seconde commande plus utilisée est celle qui permet de copier un fichier vers
un autre fichier ou vers un répertoire (le fichier originel restant en place).
Si l'option -R est précisée, il est possible de recopier un répertoire (et ses sous
répertoires) dans un autre répertoire.
mv
rm
10
Supprimer filigrane Wondershare
PDFelement
Ma_machine>rm -f fic*
Ma_machine>rm -r rep
grep
11
Supprimer filigrane Wondershare
PDFelement
sources :
tail
Votre code s'est exécuté et vous souhaitez savoir si tout s'est bien passé. Pour
cela il suffit de "voir" la fin du contenu du fichier output (dans le cas d'un job)
par la commande tail NomFichier (elle n'affichera que les 10 dernières lignes
du fichier NomFichier).
tail -f output affichera "en direct live" votre fichier. Sans cette commande,
vous seriez obligé d'éditer le fichier et de le recharger toutes les 10
secondes !
12
Supprimer filigrane Wondershare
PDFelement
find
Dans le cas où des fichiers ne sont pas aux "bons" endroits, il faut être capable
de les retrouver. Pour cela une seule commande, find.
Elle paraît toujours un peu compliquée au début, mais on lui pardonne très vite,
lorsqu'on découvre sa puissance !
Voilà des exemples qui résument les possibilités de find ( find "à partir de"
"que faire" "que faire" etc.) :
• cet exemple va chercher tous les noms des fichiers qui comportent la
chaîne de caractères exe1 dans les noms des fichiers du répertoire rep1
ainsi que dans tous ses sous-répertoires. Attention, la recherche est
récursive.
• Si vous voulez tous les fichiers core égarés sur votre disque et qui
consomment de la place inutilement :
find ~ -name "core" -print
13
Supprimer filigrane Wondershare
PDFelement
• Encore plus fort, si vous voulez supprimer directement les fichiers trouvés,
il est possible plutôt que de faire afficher seulement les noms de ces
fichiers, de les détruire également :
find ~ -name "core" -exec rm {} \;
Remarque : {} permet de passer les noms des fichiers trouvés par find à
la commande rm et le \; à la fin est obligatoire.
• Avec deux filtres c'est possible !
find ~ \( -name "*.L" -o -name "*.o" \) -exec rm {} \;
équivalent à
find ~ -name "*.[Lo]" -exec rm {} \;
• En fait tout est possible, les filtres sont évalués de gauche à droite. Ici on
essaye de supprimer les fichiers contenant "chaine" ; si on n'arrive pas à
faire le rm, on affiche le fichier
find . -exec grep -q chaine {} \; ! -exec rm {} \; -print
• Il est possible de spécifier dans le filtre le type d'élément cherché (fichier -
type f, ou répertoire -type d) ou ayant une taille particulière (-size nk),
le -ok a le même rôle que -exec avec la confirmation en plus.
find . -type -d -print
find . -size 0k -ok rm {} \;
• Il est également possible de spécifier la date de l'élément cherché (-atime
+n avec n le nombre de jours depuis le dernier accès)
find / \(-name "a.out" -atime +7\) -o \(-name "*.o" -atime +30\)
-exec rm {} \;
• Un autre cas pratique, vous n'arrivez pas à faire un rm sur un fichier car
son nom contient un caractère "bizarre". Nous allons demander à find de
détruire (avec confirmation via un -ok ) un fichier par son numéro d'inode.
ls -i (pour trouver son numéro d'inode ici 733)
find . -inum 733 -ok rm {} \;
Remarque sur le rm : si vous voulez supprimer un fichier qui
commence par
▪ - , vous allez avoir quelques surprises, alors utilisez l'option -
- de rm ainsi :
rm -- fic_avec_un-
▪ # , faites rm ./#fic_avec_un# ou rm \#fic_avec_un#
14
Supprimer filigrane Wondershare
PDFelement
Tableau I
Après avoir ouvert une fenêtre terminal, vous êtes pris en charge
par un interpréteur de commandes : le Shell. Ce programme interactif
invite l'utilisateur à introduire une ligne de commande(s), qui après
vérification sera exécutée. Une fois terminée, le contrôle reviendra au
shell qui relancera alors le dialogue.
Le shell bash (Bourne Again Shell) est l'un des shells les
plus utilisés sur un vaste panel de plates-formes (Linux,
Mac OS X, BSD et bien d'autres OS). Son succès tient
principalement à sa grande souplesse.
15
Supprimer filigrane Wondershare
PDFelement
Le choix d'un shell peut conditionner une grande partie de votre travail.
Le shell est simplement un interprèteur de vos commandes. Il va
également déterminer les fichiers responsables de la mise en place de
votre environnement et gérer la mémoire. Il se nomme ainsi (coquille) car
il enveloppe le noyau Unix, toutes les commandes sont passées au noyau
à travers votre shell).
Pour le choix d'un shell, deux grandes familles s'affrontent : les shell-iens
et les cshell-iens : la guerre dure depuis longtemps mais est en passe
d'être gagnée par les premiers ! Comme vous êtes débutant, je vous
conseille de vous rallier au futur vainqueur, c'est-à-dire les shell de la
famille du sh (sh, ksh, bash), l'autre famille csh étant uniquement
représentée par le tcsh et le csh lui-même.
Sur votre station ou votre PC sous Linux vous avez certainement le choix
entre le bash, le ksh, le tcsh Je conseille donc naturellement aux
débutants le shell bash qui a été écrit pour Linux et possède un grand
nombre de fonctionnalités communes.
Les conséquences d'un tel choix ne sont pas anodines. En effet, votre
séquence de "boot" (connexion) est contrôlée par 1 ou 2 fichiers de
démarrage. Un premier fichier est exécuté (avant que vous n'ayez la
main) c'est le .bash_profile. Ce fichier se trouve dans votre HOME et est
précédé par un point (lui permettant de rester "caché" si l'on utilise un
simple ls). Ce fichier sert essentiellement à positionner, par défaut, toutes
les variables d'environnement utiles au bon fonctionnement de votre
session de travail comme le positionnement des chemins (path) par
défaut. Il sert également à définir (via la variable ENV généralement
valorisée par ENV=.bashrc) le nom du fichier qui sera exécuté juste
après le .bash_profile et qui sera lancé à par chaque appel à /bin/bash
déclenché pour ouvrir une nouvelle fenêtre, ou un sous-shell ou ou dans
un script (uniquement si cette variable a été exportée voir la suite du
cours).
16
Supprimer filigrane Wondershare
PDFelement
A noter que, quel que soit le shell utilisé, tous les environnements sont
initialisés par le fichier /etc/profile modifiable uniquement par
l'administrateur.
17
Supprimer filigrane Wondershare
PDFelement
Si vous voulez quand même interpréter les dollars, utilisez les " (doubles
quotes),
>echo "$PATH?*_\"
>/usr/bin?*_\
Mais avant de vous lancer dans l'écriture de scripts, soyez sûr que le traitement
que vous souhaitez réaliser ne soit pas déjà effectué par une commande unix !
(ça arrive TRÈS souvent au débutant !). Aussi avant de voir plus en détail
18
Supprimer filigrane Wondershare
PDFelement
sort : permet de trier les lignes d'un fichier (fic) suivant un champ particulier.
uniq : permet de supprimer les lignes identiques et de les compter (attention les
lignes doivent être triées)
exemple tr a-z A-Z permet de passer toutes les lettres d'un flux en majuscules.
Deux options intéressantes :
• -s '\000' qui supprime les caractères contigus passés en argument, ici les
octets nuls,
• -s ' ' qui supprime les caractères contigus blancs,
• -d ':cntrl:' qui supprime tous les caractères de contrôle.
Par exemple: ls -l * liste selon l'ordre alphabétique le nom de tous les fichiers et
répertoires du répertoire courant en précisant la date de leur dernière utilisation,
leur taille, leur état, ...
L'interpréteur permet aussi de ranger dans un fichier une suite, une procédure
de commandes et de les faire exécuter en invoquant le nom du fichier suivi des
paramètres ce qui transforme cette procédure en une nouvelle commande. Ainsi,
il est possible de créer un environnement sur mesure, adapté aux besoins.
20
Supprimer filigrane Wondershare
PDFelement
L'écriture d'une telle procédure dans le fichier de nom, par exemple: commande,
doit suivre les règles suivantes :
Remarques :
21
Supprimer filigrane Wondershare
PDFelement
• $0 désigne chercher
• $1 désigne MOT1
• $2 désigne MOT2
• $* désigne MOT1 MOT2
• $# désigne 2
➢ Les variables locales :Elles n'ont pas à être déclarées. Il suffit de les
initialiser. Par exemple:
VarLocale1=valeur1 VarLocale2=valeur2 ... La valeur de VarLocale1 est
$VarLocale1 ou ${VarLocale1} ce qui en permet la concaténation avec tout
autre texte. Pour rendre ces variables locales permanentes, il faut les
"exporter" par
export VarLocale1 VarLocale2
Dès lors, ces variables deviennent des variables d'environnement.
La boucle for:
22
Supprimer filigrane Wondershare
PDFelement
for i in $*
do
echo Le parametre est $i
done
et taper boucle1 a bb 45 donne boucle1: Permission denied
Il faut donner au moins les droits d'accès r-x par la frappe de chmod 500 boucle1
Alors, la frappe de boucle1 a bb 45 affiche :
Le parametre est a
Le parametre est bb
Le parametre est 45
for i in $*
do
echo 'Le parametre est $i'
done
alors la frappe de boucle2 a bb 45 donne :
Le parametre est $i
Le parametre est $i
Le parametre est $i
La mise entre apostrophes a empêché l'interprétation de $i qui deviennent alors
2 caractères standards. La mise entre apostrophes neutralise l'interprétation des
$var.
23
Supprimer filigrane Wondershare
PDFelement
for i in $*
do
echo "Le parametre est $i"
done
alors la frappe de boucle3 a bb 45 donne :
Le parametre est a
Le parametre est bb
Le parametre est 45
$i est de nouveau interprété mais le caractère * entre les "" ne le serait pas.
24
Supprimer filigrane Wondershare
PDFelement
Remarques :
- Pour écrire une commande sur plusieurs lignes, il faut
terminer chaque ligne, sauf la dernière par \ et sans aucun
blanc derrière ou autre caractère. En effet, \ neutralise le
caractère \nl de fin de ligne ce qu'il ne réalise pas si un
caractère est situé entre \ et \nl.
Exemple :
break / continue :
Autres exemples: Pour les boucles sur des indices consécutifs on choisira
une boucle while ainsi :
25
Supprimer filigrane Wondershare
PDFelement
#!/bin/bash
i=1
while ((i<=5))
do
qsub job.$i #Pour soumettre un job NQS sur une machine de calcul
((i=i+1))
done
Pour la lecture d'un fichier ou d'un flux (sortie de commande dans l'exemple) on
pourra également choisir un while ainsi :
#!/bin/bash
ls |
{
while read ligne
do
echo $ligne
done
}
Ou même en une seule ligne, on fait commande2 tant que commande1 est
réussie
...
while commande1;do commande2;done
...
case $Var in
option1) commandes1 ;;
option2) commandes2 ;;
...
optionm) commandesm ;;
*) commandes ;;
esac
Si $Var vaut option i, alors, les commandes i sont exécutées, puis, la commande
au-dessous de esac est exécutée. Le caractère * signifie "n'importe quel
caractère" et cette option joue le rôle de sinon c'est à dire de tous les autres cas
possibles.
26
Supprimer filigrane Wondershare
PDFelement
case $REP in
[hH]elp ) echo j'ai tapé help;;
go|run) echo le code démarre;;
* ) echo le reste;;
esac
Exemple:
cd
if test -d $MEFISTO
ls $MEFISTO
else
echo Pas de repertoire $MEFISTO
fi
donne
resultat: bin doc elas incl mail ot poba pp reso td test ther util xvue
De même,
if test -f $1
then
:
else
>$1
fi
27
Supprimer filigrane Wondershare
PDFelement
if commandes1
then
commandes2
else
if commandes3
then
commandes4
fi
fi
peut être écrit sous la forme équivalente
if commandes1
then
commandes2
elif commandes3
commandes4
fi
Exemple:
28
Supprimer filigrane Wondershare
PDFelement
echo OUI
else
echo NON
fi
Les tests peuvent porter aussi sur les chaînes ou l'état des fichiers avec
[[ ]], ou sur les nombres avec (( ))
if (( numero < 10 )) || (( a != 2 ))
# liste d'opérateurs == != < > <= >=
then
echo "c'est plus petit"
else
echo "c'est plus grand"
fi
ou
read rep
if [[ $rep = "oui" ]]
#liste d'opérateurs = != < >
then
rm -f *.h
fi
ou
if [[ ! -a mon_fichier ]]
#liste d'opérateurs -a (any) -f (fichier) -d (directory) -S (non vide)
#fic1 -nt fic2 (vraie si fic1 plus récent)
then cp $HOME/mon_fichier .
fi
Il est possible de faire des tests plus simplement. En effet chaque commande
exécutée renvoie un code de retour (0=vrai ou 1=faux) qui peut être interprété
par le shell.
29
Supprimer filigrane Wondershare
PDFelement
commandes1 || commandes2
exécute commandes2 seulement si le code d'erreur de commandes1 est >0
Un ou est représenté par ||, et un et par &&. Voici des exemples appliqués au
bash :
• grep XX file && lpr file qui permet d'imprimer un fichier s'il
contient XX
• ls mon_fichier && echo "mon fichier est bien présent "
• mon_code || echo "le code a planté !"
• commande || exit au sein d'un script
Le texte résultat a été segmenté en 6 paramètres qui ont ensuite été affichés en
sens inverse.
30
Supprimer filigrane Wondershare
PDFelement
L'écriture d'un script comme celle d'un programme peut devenir assez complexe
si l'on ne dispose pas d'outils pour suivre l'évolution du code/script.
Ma_machine$>set -v
Ma_machine$>set -x
set -x
Ma_machine$>ls titi
ls titi
+ ls titi
titi
Ma_machine$>ls *
ls *
+ ls tata titi tutu
tata titi tutu
La frappe de i=1
i=`expr $i + 1`
echo $i
donne
2
Si comp est l'un des opérateurs < , <= , = , != , >= , > alors, expr1 comp expr2
donne la valeur 1 si l'opération de comparaison numérique entre valeurs
numériques ou lexicographique entre chaînes de caractères est vraie.
31
Supprimer filigrane Wondershare
PDFelement
expr1 & expr2 donne la valeur de expr1 si expr1 et expr2 sont non nulles, sinon
celle de expr2. expr1 | expr2 donne la valeur de expr1 si elle est non nulle, sinon
celle de expr2.
g.4 shift décale les paramètres d'un cran, $2 devient $1, $3 devient $2, ...
Exemple: time `ls` affiche le contenu du répertoire courant puis {\tenttbis real
0m0.34s user 0m0.02s sys 0m0.04s}
$? permet de déterminer si une commande est bien "passée", son code de retour
est alors 0. Si elle a généré des erreurs, son code de retour est alors >0. Aussi
n'est-il pas rare de voir dans un script :
...
Commande Compliquée
if (($? != 0))
then
echo "pb sur commande_compliquee "
break
else
echo "ça marche ..."
fi
...
Si vous faites un script avec des paramètres en entrée, comment les récupérer ?
for i in $@
do
echo $i
done
• Attention $(cmd) n'est pas une variable mais le résultat d'une commande
cmd.
Ma_machine$>ls
Ma_machine$>titi toto tata
Ma_machine$>result=$(ls tutu)
Ma_machine$>echo $result
Ma_machine$>The file tutu does not exist.
g.6 Vous pouvez également définir des tableaux à une dimension ainsi :
nom_du_tableau[indice1]=champ1
nom_du_tableau[indice2]=champ2
nom_du_tableau[indice3]=champ3
...
ou plus synthétiquement :
Ma_machine$>tab="zero"
Ma_machine$>tab[1]="premier"
Ma_machine$>tab[2]="deuxième"
Ma_machine$>echo $tab
zero
Ma_machine$>echo $tab[1]
zero[1]
Ma_machine$>echo ${tab[1]}
33
Supprimer filigrane Wondershare
PDFelement
premier
Ma_machine$>a='coucou'
Ma_machine$>b=a
Ma_machine$>echo $b
a
Ma_machine$>echo \$$b
$a
Ma_machine$>eval echo \$$b
coucou
Ma_machine$>c=\$$b
Ma_machine$>echo $c
$a
Ma_machine$>eval c=\$$b
Ma_machine$>echo $c
coucou
g.8 Fonctions :
Comme dans de nombreux langages, vous pouvez créer vos propres fonctions.
La syntaxe est la suivante :
nom_de_la_fonction () { liste; }
le blanc entre { et avant liste et le point virgule après liste sont obligatoires. Le
code de retour est celui de la dernière commande exécutée dans la fonction. Il
n'y a pas de nouveau process créé. De plus toutes les variables de la fonction
sont partagées sauf si l'attribut "local" est précisé.
local nom_de_la_variable_locale=456
Quelques variables purement shell peuvent aussi être utiles, PRINTER pour
définir par défaut le nom de votre imprimante, et SHELL pour le nom de votre
shell favori.
awk permet de traiter des fichiers ligne à ligne et d'y associer un même
traitement. awk divise éventuellement le travail en trois étapes :
34
Supprimer filigrane Wondershare
PDFelement
• Affiche les 2e et 4e champs d'un fichier fic1 (pour chaque ligne) avec un
format
awk '{printf ("%-9s | %3s \n",$2,$4)}' fic1
• Affiche les champs 3 et 2 si le champ 1 contient URGENT et compte les
occurrences
awk 'BEGIN{x=0} $1 ~ /URGENT/ {print $3, $2 ; ++x} END{print
"total" x}' fic1
• Changement du séparateur de champs par défaut (" " ou TAB)
awk 'BEGIN{FS=":"} print $1; print "la ligne complète est" $0' fic1
• Analyse des couleurs d'un document html (version 1)
grep color unix_u_cours.html | awk 'BEGIN{FS="#"}{ print $2}' |
cut -c1-6 | sort | uniq -c
• Analyse des couleurs d'un document html (version 2)
awk 'BEGIN{FS="#"} $0 ~ /color/ {print substr($2,0,6) } '
unix_u_cours.html | sort | uniq -c
• Somme des éléments d'un fichier poub
awk 'BEGIN{a=0} {a=a+$0} END{print a}' poub
• Moyenne des éléments communs d'un fichier poub (nom chiffre)
awk 'BEGIN{NOM="";compteur=0;tot=0} { if ( $1 == NOM )
{tot=tot+$2;compteur=compteur+1} else { if (NR!=1) print
tot/compteur,NOM ; NOM=$1;tot=$2;compteur=1} }END{print
tot/compteur,NOM } ' poub
35
Supprimer filigrane Wondershare
PDFelement
Chaque ligne du fichier traité est décomposée en champs ($1, $2, $3, ...), la
ligne entière est référencée par $0. Deux autres variables internes sont très
utiles, NF pour le nombre de champs et NR le numéro du "record" (lignes en
général).
Une multitude de fonctions existent comme cos, int, exp, sqrt, toupper, tolower
etc.
• mono-dimensionnés :
Tab[87]="milieu"
• associatifs :
Tab["rouge"]=924
Si votre script fait quelques lignes, mettez-le dans un fichier et utilisez l'option -f
de awk ainsi :
awk -f mon_script fic1
Il est possible de faire des choses très complexes avec awk, mais si vous avez
plus de trois lignes à faire en awk,
36
Supprimer filigrane Wondershare
PDFelement
On peut voir ces symboles comme une écriture sur un fichier pour le supérieur,
une lecture à partir d'un fichier pour l'inférieur, un simple tuyau pour le pipe. Ce
tuyau servant à relier deux commandes entre elles, c'est-à-dire, la sortie de l'une
devient l'entrée de l'autre.
a/ Série d'exemples :
$>cat mon_premier_fichier
Thu Oct 29 15:39:56 MET 1998
sfuj742 pts/0 Oct 28 08:00 (xt2-fuji.idris.f)
jpp pts/5 Oct 29 08:32 (buddy.idris.fr)
lavallee pts/8 Oct 29 08:39 (bebel.idris.fr)
gondet pts/9 Oct 29 08:48 (glozel.idris.fr)
$>
commande_bavarde | more
cat * | sort
à la place de
sort *
• Pour fusionner les deux flux (sortie et erreur), utilisez cette syntaxe :
commande 1> poub 2>&1 qui redirigera le flux 2 vers le flux 1
(attention uniquement avec la famille sh).
• Pour rediriger la sortie d'erreur dans un fichier (sans bloquer le flux
standard):
commande 2>erreur
38
Supprimer filigrane Wondershare
PDFelement
• Si vous voulez que les sorties ne soient pas affichées ou conservées dans
un fichier, il suffit de les envoyer vers /dev/null ainsi :
script_bavard > /dev/null
• Pour rediriger la sortie d'erreur dans un pipe sans le flux standard :
(commande 1>/dev/null) 2>&1 | more
✓ processus utilisateurs
Ainsi, il est possible de contrôler l’exécution d’une sous tâche grâce au PID du
processus. Pour vous en convaincre, un petit exemple de script BASH :
#!/bin/bash
sleep 3
kill $!
exit 0
Tout comme les fichiers, un système UNIX identifie les processus grâce à un
nombre. Cette information s’appelle le PID (Process IDentificator). Comme un
fichier, un processus a un propriétaire. L’analogie s’arrête ici. Toutes les
informations concernant les processus s’obtiennent avec la commande ps. (Vous
pouvez retrouver l’ensemble des options en consultant le manuel en ligne).
– le propriétaire (UID) ;
– la priorité (PRI) ;
– l’état (STAT)
Si vous ajoutez l’option ”f, les liens de parenté entre les différents processus
apparaitront plus facilement. Notez que tous les processus sont lancés par le
processus init dont le PID est 1. Le processus père du processus init n’est autre
que le noyau (PID ´égal à 0). Vous pouvez utiliser la commande pstree pour
visualiser d’une seconde manière l’arborescence des processus.
40
Supprimer filigrane Wondershare
PDFelement
– Z : le processus est zombi : il est mort mais son père ne le sait pas.
Lorsque vous utilisez des commandes ou vos programmes favoris sous Unix, ils
s'exécutent systématiquement sous votre shell.
Tant que la commande s'exécute, vous n'avez plus la main, vous êtes bloqué.
Certains utilisent plusieurs fenêtres pour continuer à travailler.
Quel que soit votre commande ou votre exécutable, c'est en fait un processus
Unix qui peut être facilement contrôlé.
CTRL-z / bg / fg
Sur une commande un peu longue comme un find (que l'on a déjà vu) essayez
un CTRL z. Cela bloquera le find et vous permettra de retrouver la main sous le
shell. Votre processus sera suspendu. Pour le réactiver sans être de nouveau
bloqué tapez bg pour background (arrière-plan).
La séquence CTRLz suivie de bg est identique au & souvent utilisé après une
commande. L'avantage de CTRLz + bg est qu'il est possible via fg (foreground,
avant-plan) de revenir à la situation de départ (c'est-à-dire comme si vous aviez
lancé la commande sans & à la fin), un CRTL c (permettant de tuer votre
commande) est donc toujours potentiellement actif.
41
Supprimer filigrane Wondershare
PDFelement
• ps /kill
Mais comment faire si un CRTL c ne fonctionne pas et qu'il n'y a pas de menu
"close" dans l'application ? Sous d'autres systèmes, pas grand-chose, à part tout
redémarrer... Sous Unix, il suffit de trois choses :
• avoir une fenêtre pour taper des commandes, ou pouvoir en créer une
(sinon allez voir votre administrateur, root (le login qui a tous les droits) a
toujours une fenêtre pour les cas d'urgence),
• trouver le numéro de process de votre commande ou application que vous
souhaitez tuer. Pour cela (et en général seulement pour ça) faites un "ps -
edf | grep mon_login" ou "ps aux | grep mon_login" suivant votre
machine,
• faire un kill numéro du process_à_tuer. Si ça ne suffit pas, utiliser
l'artillerie lourde kill -9 numéro_du_process_à_tuer. (Remarque, un kill -1
permet de relancer un process avec prise en compte du fichier de
configuration pour un démon par exemple.)
wait fait attendre le processus père jusqu'à la fin de l'exécution de tous ses
processus fils wait 1034 fait attendre jusqu'à la fin de l'exécution du processus
1034.
42
Supprimer filigrane Wondershare
PDFelement
#!/bin/bash
a=1
let b=2
echo $a $b
Après l’exécution de ce script du nom essai : sh essai ; il affiche 1
2
02/ Exemple :
#!/bin/bash
echo "entrez votre nom"
read nom
echo "vous vous appelez $nom"
echo "entrez le prenom"
read prenom
echo "votre prenom $prenom "
echo "votre date de naiss"
read naiss
echo "vous êtes nez $naiss"
03/ Exemple :
#!/bin/bash
read var
if [ $var -eq 5 ]
then
echo "var est egal a 5";
else
echo "var ne vaut pas 5";
fi
#!/bin/bash
for i in 1 2 3 4 5 ; do
echo "bonjour $i fois "
done
43
Supprimer filigrane Wondershare
PDFelement
#!/bin/bash
xcalc &
d=$!
wait $!
xclock &
f=$!
#!/bin/bash
echo " si vous voulez quittez tapez le mot exit "
while true
do
if [ $var = "exit" ]
then
exit 0
fi
echo " entrez charctere "
read var
case $var in
[A-Z])
echo " une lettre maj "
;;
[a-z])
echo " une lettre miniscule "
;;
[0-9])
echo " un nombre "
44
Supprimer filigrane Wondershare
PDFelement
;;
?) echo " caractere special "
;;
*)
echo " vous avez entré plus d’un caractere "
;;
esac
done
#!/bin/bash
echo "Bienvenue ce programme va afficher la liste des
processus lancés par l'utilisateur et afficher leur état
respectif."
if ( test $# -eq 0 )
then echo ' Erreur syntaxe'
else ps hU $1 -o state,command > tempfile
number=$(wc -l < tempfile)
i=1
while [ $i -le $number ]
do
commande=$(tail -$i tempfile|head -1|cut -d" " -f2)
etat=$(tail -$i tempfile|head -1|cut -d" " -f1)
i=$(( i+1 ))
echo -n " $commande :"
case $etat
in
D) echo "endormi => ininterruptible D" ;;
S) echo "endormi S" ;;
R) echo "en cours R" ;;
T) echo "stop T" ;;
Z) echo "zombi Z" ;;
*) echo "inconnu" ;;
esac
done
rm tempfile
fi
45
Supprimer filigrane Wondershare
PDFelement
Exécutions :
Bourshell : sh suivi du nom du fichier
Korn-shell ksh suivi du nom du fichier
#!/bin/csh
while (! $?listProcess )
endif
end
echo ""
rm outEXO
46
Supprimer filigrane Wondershare
PDFelement
03/ Exemple : copie d’un fichier dans un autre fichier : simulation de la commande
unix cp fichier1 fichier2 en langage C-shell
#!/bin/csh
end
if ( $continuer == "oui" || $continuer == "0UI" ) then
echo "entrer le nom de fichier a copier:"
set fichier1 = $<
Exécutions :
C-shell : csh suivi du nom du fichier
T-Cshell : tcsh suivi du nom du fichier
#!/bin/bash
ps u
echo -n "Quel processus voulez-vous supprimer: "
read name
PID=$(ps -Af | grep $USER | grep " $name" | grep -v grep | tr -s ' '
| cut -f 2 -d ' ')
if [ $(echo $PID | wc -c ) -eq 1 ]
then
echo "pas de processus $name"
exit 1
fi
i=$(expr $i + 1)
done
#!/bin/csh
ps -u
echo -n "Quel processus voulez-vous supprimer: "
set name = $<
set PID=`ps -Af | grep $USER | grep " $name" | grep -v grep | tr -s
' ' | cut -f 2 -d ' ' `
if (( `echo $PID | wc -c ` == 0 ))then
echo "pas de processus $name"
exit 1
endif
#
# Déclenche le processus enfant2
#
# Attend (wait 10)
#
# Tue le processus enfant2#
#!/bin/bash
lancer() {
./$1.sh &
sleep 1
kill -9 `cat $1.pid` 2> /dev/null
rm $1.pid
}
while true; do
lancer ping
lancer pong
done
#Contenu du script enfant1 (ping.sh) :
#!/bin/bash
if [ -e *.pid ]; then sleep 1; fi
echo $$ > ping.pid
while true; do
echo -n "ping "
sleep 5
done
#Contenu du script enfant2 (pong.sh) :
#!/bin/bash
if [ -e *.pid ]; then sleep 1; fi
echo $$ > pong.pid
while true; do
echo -n "pong"
sleep 5
done
En C, toute variable doit faire l'objet d'une déclaration avant d'être utilisée.
#include
main()
{
int a = 0;
int b = 1;
if (a = b)
printf("\n a et b sont egaux \n");
else
printf("\n a et b sont differents \n");
}
imprime à l'écran a et b sont egaux !
01/ Ce programme a pour seul but d'afficher le texte « Bonjour ! » suivi d'un retour
à la ligne :
int main(void)
{
printf("Bonjour !\n");
return 0;
}
51
Supprimer filigrane Wondershare
PDFelement
main()
{ int i = 3, j = 2;
printf("%f \n",(float)i/j);
}
#include <stdio.h>
double SquareRoot(double X) {
double A,B,M,XN;
if(X==0.0) {
return 0.0;
} else {
M=1.0;
XN=X;
while(XN>=2.0) {
XN=0.25*XN;
M=2.0*M;
}
while(XN<0.5) {
XN=4.0*XN;
M=0.5*M;
}
A=XN;
B=1.0-XN;
do {
A=A*(1.0+0.5*B);
B=0.25*(3.0+B)*B*B;
} while(B>=1.0E-15);
return A*M;
}
}
int main() {
double R;
printf ("introduire R");
scanf ("%f",&R);
while(R<=1000.0) {
52
Supprimer filigrane Wondershare
PDFelement
printf("Sqrt(%f)=%f\n",R,SquareRoot(R));
R*=R;
}
}
#include<stdio.h>
const int nmax=100;
int main(){
int tab[nmax][nmax];
int n=-1;
int i,j;
char r='o';
do{
printf("Taper le degre du triangle:");
scanf("%d",&n);
for(i=0;i<=n+1;i++)
{
tab[i][i]=1;
tab[i][0];
for(j=1;j<i;j++)
tab[i][j]=(tab[i-1][j])+(tab[i-1][j-1]);
}
printf("triangle de pascal de degre %d: \n",n);
for(i=1;i<=n+1;i++){
printf("n=%d ",i-1);
for(j=0;j<=i;j++)
if ((tab[i][j])!=0)
printf("%d ",tab[i][j]);
printf("\n");
}
printf("Voulez vous continuer? (o ou n): ");
scanf("%s",&r);
} while(r=='o' && r=='O' || (r!='n'&& r!='N'));
return 0;
}
53
Supprimer filigrane Wondershare
PDFelement
#include<stdio.h>
main()
{
int A,B,C,AIDE;
printf("Introduisez trois nombres (A,B,C:");
scanf("%i%i%i",&A,&B,&C);
/*Affichage a l`aide de tabulations*/
printf("A=%i\tB=%i\tC=%i\n",A,B,C);
AIDE=A;
A=C;
C=B;
B=AIDE;
printf("A=%i\tB=%i\tC=%i\n",A,B,C);
return 0;
}
#include <stdio.h>
int main()
{
int A ,B ,C ,x ;
char choix = 'i' ;
while(choix != 'f')
{
printf(" ***** faites entrer les nombres : *****\n ") ;
printf(" A= ") ; scanf("%d",&A) ;
printf(" B= ") ; scanf("%d", &B) ;
printf(" C= ") ; scanf("%d", &C) ;
printf("\n");
printf(" ****** les valeurs apres la permutation : ******\n");
x= B;
B=A ;
A=C ;
C=x ;
printf(" A= %d ",A);
printf(" B= %d ",B);
printf(" C= %d ",C) ;
printf("\n");
54
Supprimer filigrane Wondershare
PDFelement
#include<stdio.h>
int main ()
{
int N,I;
double FACT;
do
{ printf("Entrez un entier:");
scanf("%d",&N);
}
while(N<0);
/*a*/
/*I=1;
FACT=1;
while(I<=N)
{
FACT*=I;
I++;
}
*/
/*b*/
for (FACT=1.0,I=1;I<=N;I++)
FACT*=I;
printf("%d!=%.0f\n",N,FACT);
return 0;
}
55
Supprimer filigrane Wondershare
PDFelement
Il existe une filiation dans les processus : le créateur d'un nouveau processus est
appelé le père et le nouveau processus, le fils. La plupart des attributs système
du père (par exemple les droits sur le système de fichier) sont transmis au fils,
de la même manière que l'héritage. Au démarrage d'un système Unix, un seul
processus existe (de numéro 1). Tous les autres processus qui peuvent exister
au cours de la vie du système descendent de ce premier processus, appelé init,
via des appels système comme fork2, vfork3, posix_spawn4 ou d'autres moyens.
Sur les premiers UNIX, seul l'appel système fork permet de créer de nouveaux
processus5,6.
08-a Exemple
/*
* fork-ex1.c : exemple d'utilisation de l'appel systeme fork()
pour creer
* un nouveau processus.
*/
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
56
Supprimer filigrane Wondershare
PDFelement
08-b Exemple
/*
* fork-ex2.c : exemple plus completd'utilisation de l'appel
systeme fork() pour creer
* un nouveau processus.
*/
#include <stdio.h>
#include <errno.h>
#include <sys/types.h>
main()
{
pid_t pid;
pid = getpid();
fprintf(stdout,"Avant le fork, pid = %d\n",pid);
sleep(20);
pid = fork();
/* En cas de reussite du fork, le pere et le fils poursuivent leur
execution a partir d'ici. La valeur de pid permet de distinguer
le pere du fils.
*/
57
Supprimer filigrane Wondershare
PDFelement
switch(pid) {
01/ Exemple :
a/ en langage C
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<errno.h>
int main(){
system("ps -u");
int test,i=0;
char STAT,user;
printf("entrer le nom user\n");
scanf("%c",&user);
58
Supprimer filigrane Wondershare
PDFelement
if(user==' '){
printf("erreur syntax:etat processus-user");}
else
{
switch(STAT){
case 'D' :
printf("endormi=>ininTERRUPTIBLE");
break;
case 'T':
printf("bloque");
break;
case 'S':
printf("endormi -20s");
break;
case 'I':
printf("endormi +20s");
break;
default :
printf("inconnu");
}
}
}
b/ Sa traduction en script Shell
#!/bin/bash
if ( test $# -eq 0 )
then echo ' Erreur syntx'
else ps hU $1 -o state,command > tempfile
number=$(wc -l < tempfile)
i=1
while [ $i -le $number ]
do
commande=$(tail -$i tempfile|head -1|cut -d" " -f2)
etat=$(tail -$i tempfile|head -1|cut -d" " -f1)
i=$(( i+1 ))
echo -n " $commande :"
case $etat
in
D) echo "endormi => ininterruptible D" ;;
S) echo "endormi S" ;;
R) echo "en cours R" ;;
59
Supprimer filigrane Wondershare
PDFelement
02/ Exemple :
L'objectif de cet exercice est de créer une commande ikill ne prenant pas
d'argument mais demandant un nom de programme à l'utilisateur et tuant
ce programme.
a/ en langage C
#include<signal.h>
#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include<sys/types.h>
#include<stdlib.h>
int main(){
system("ps -u");
kill(getpid(),SIGKILL);
}
int getpid(){
FILE *fp;
char name[300];
char temp[300];
char pid[300];
int p;
printf("donner le nom du processus ");
scanf("%s",name);
strcpy(temp,"ps -Af | grep $USER | grep ");
strcat(temp,name);
strcat(temp," | grep -v grep | tr -s ' ' | cut -f 2 -d ' ' ");
fp=popen(temp,"r");
fgets(pid,8,fp);
p=atoi(pid);
return p;
pclose(fp);
}
60
Supprimer filigrane Wondershare
PDFelement
#!/bin/bash
ps u
echo -n "Quel processus voulez-vous supprimer: "
read name
PID=$(ps -Af | grep $USER | grep " $name" | grep -v grep | tr -s ' '
| cut -f 2 -d ' ')
if [ $(echo $PID | wc -c ) -eq 1 ]
then
echo "pas de processus $name"
exit 1
fi
03/ En vous inspirant sur les exemples précédents : Ecrire le script shell réveille capable
de réveiller tous vos processus qui ont été suspendus par un signal SIGSTOP :
Version en Langage C :
#include<unistd.h>
#include<stdio.h>
#include<signal.h>
#include<sys/types.h>
int main(){
61
Supprimer filigrane Wondershare
PDFelement
printf("Processus? ");
scanf("%d",&pid) ;
kill (pid,SIGSTOP);
printf("Processus suspendu %d\n",pid);
system ("ps -u");
system("sleep 4");
kill (pid,SIGCONT);
printf("Poursuivre lexecution %d\n",pid);
system ("ps -u");
62
Supprimer filigrane Wondershare
PDFelement
XI/ Conclusion.
63
Supprimer filigrane Wondershare
PDFelement
XII/ Références
64