Académique Documents
Professionnel Documents
Culture Documents
N.ABGHOUR
2010-2011
nabghour@gmail.com
Généralité
Rappel des commandes de base
Le SHELL
Les filtres UNIX
La programmation SHELL
Gestion des signaux
La commande sed
Le Langage awk
N.ABGHOUR UNIX AVANCE
Linux: Généralité
Propriétés
multi-tâches
multi-utilisateurs
portable
Libre (et gratuit) !!
Kernel
Shell
Applications
Applications :
rm, mv, Star Office, netscape, etc…
man commande
Pour
Pourplus
plusd’information
d’informationet
etde
deprécision
précisionsur
surles
lescommandes
commandesn’hésitez
n’hésitezsurtout
surtout
pas
pasààlire
lireles
lespages
pagesde
demanuel
manuelassociées
associéesen entapant
tapantlalacommande
commande: :
man
mannom
nomde delalacommande
commande
pwd
Afficher
Afficherlelenom
nomdu
durépertoire
répertoirede
detravail
travailen
encours
cours(répertoire
(répertoirecourant).
courant).
cd
La
Lacommande
commandeinterne
internecd
cdpermet
permetde
dechanger
changerde
derépertoire
répertoirecourant.
courant.
ls [OPTIONS] [fichiers]...
La
Lacommande
commandelslsaffiche
affichetout
toutd’abord
d’abordl’ensemble
l’ensemblededeses
sesarguments
argumentsfichiers
fichiers
autres
autresque
quedes
desrépertoires.
répertoires.Puis
Puislslsaffiche
affichel’ensemble
l’ensembledes
desfichiers
fichierscontenus
contenus
dans
danschaque
chaquerépertoire
répertoireindiqué.
indiqué.
-R
-R : :Afficher
Afficherrrécursivement
écursivement lelecontenu
contenudes
dessous -répertoires.
sous-répertoires.
-a
-a : :Afficher
Affichertous
tousles
lesfichiers
fichiersdesdesrrépertoires,
épertoires, yycompris
comprisles
lesfichiers
fichiers
commen
commençantçant par
parunun‘.‘.’
’
--i
i : :Afficher
Afficherlelenum éro dd’index
numéro ’index (i(i-noeud)
-noeud) dedechaque
chaquefichier
fichierààgauche
gauche
dedeson
sonnom.
nom.
--l
l : :EnEnplus
plusdudunom,
nom,afficher
afficherleletype
typedu
dufichier,
fichier,les
lespermissions
permissionsdd’accès,
’accès,
lelenombre
nombrede deliens
liensphysiques,
physiques,lelenom
nomdu dupropri étaire et
propriétaire etdudugroupe,
groupe,
lalataille
tailleen
enoctets,
octets,et etl’l’horodatage.
horodatage.
Les droits
Propriétaire Le nom du
la taille du
fichier
fichier
numéro nombre de
liens physique Groupe du La date de dernière
d’inode
sur le fichier propriétaire modification du fichier
Le type du
fichier
N.ABGHOUR UNIX AVANCE
Types et modes d’accès au fichier
Type :
u : user (utilisateur)
- fichier ordinaire
g : group
d répertoire
o : other (autre)
b type bloc
c type caractère r : read (lecture)
l lien symbolique w : write (écriture)
s socket x : execute (exécution)
p pipe
Tente
Tentede
dedeviner
devinerleletype
typede
defichier
fichier((répertoire,
répertoire,exécutable
exécutablebinaire,…)
binaire,…)
La
Lacommande
commandeinterne
internecd
cdpermet
permetde
dechanger
changerde
derépertoire
répertoirecourant.
courant.
$file
$ ls *
achat bateau chat chateau cheval chien gateau rateau
$ ls ?ateau
bateau gateau rateau
$ ls *ateau
bateau chateau gateau rateau
$ ls [gr]ate*
gateau rateau
$ ls [^br]ateau
gateau
$ ls [a-c]*
achat bateau chat chateau cheval chien
N.ABGHOUR UNIX AVANCE
Manipulation des noms de fichiers : basename, dirname
basename nom de fichier
La
Lacommande
commandebasename
basenameélimine
élimineles
lesrépertoires
répertoiresen
entête
têtedu
duchemin
chemind’accès
d’accès
du
dufichier.
fichier.
$ basename /usr/local/bin/lynx
lynx
$
$ dirname /usr/local/bin/lynx
/usr/local/bin
$
-R
-R modifie
modifierécursivement
récursivementles
lesdroits
droitssur
surtout
toutune
unearborescence
arborescence
ss: : set-user-ID
set-user-ID(suid)
(suid)
tt : : sticky-bit
sticky-bit
XX: : xxseulement
seulementsisirépertoire.
répertoire.
touch fichier
Modifier
Modifierl’horodatage
l’horodataged’un
d’unfichier
fichier
$ umask
022
$ls –l
-rw-r--r-- 2 nabghour fsac 231 2006-01-24 21:25 toto
$ umask 026
$ touch file
$ ls –l file
-rw-r----- 2 nabghour fsac 231 2006-01-24 21:25 file
$ mkdir rep
$ ls –l
drwxr-x--x 2 nabghour fsac 231 2006-01-24 21:25 rep
-p
-p Créer
Créerles
lesrépertoires
répertoiresparents
parentss’ils
s’ilsmanquent
manquent
Lorsqu’on
Lorsqu’oncrée
créeun
unlien
liensymbolique
symboliquede defile1
file1vers
versfile2,
file2,file2
file2référence
référencefile1.
file1.
¾¾Si file1 est supprimé, file2 référencera un fichier qui n’existe
Si file1 est supprimé, file2 référencera un fichier qui n’existe plusplus
$ ls -i
65338 fichier1 65340 fichier2
$ mv fichier1 fichier3
$ ls -i
65340 fichier2 65338 fichier3
$ mv fichier2 ..
$ ls -i ../fichier2
65340 ../fichier2
$
cp
cp liste-de-fichiers
liste-de-fichiers repertoire
repertoire: :permet
permetde dedupliquer
dupliquerles
lesfichiers
fichiers
dans
danslelerépertoire.
répertoire.
$alias
ll=‘ls –l’
rm =‘rm –i’
$ls
file Rep-contenant-1000-fichier/
$ rm file
Voulez-vous bien supprimer file [y|n]: y
$ ls
Rep-contenant-1000-fichier/
$rm –rf Rep-contenant-1000-fichier/
-perm
-permmode
mode: :fichier
fichierdont
dontles
lesautorisations
autorisationsd’accès
d’accèssont
sontfixées
fixéesexactement
exactementau
aumode
mode
indiqué
indiqué
-type
-type type
type: :fichier
fichierdu
dutype
typedonné
donné(bloc
(blocb, b,caractère
caractèrec,c,répertoire
répertoired,
d,
tube nommé p, régulier f, liens symbolique l, socket
tube nommé p, régulier f, liens symbolique l, socket s) s)
-links
-links nn: :fichiers
fichiersayant
ayantnnliens
liens
-user
-user utilisateur
utilisateur: : fichier
fichierappartenant
appartenantààl’utilisateur
l’utilisateurindiqué
indiqué
-nouser
-nouser : fichier n’appartenant à aucun utilisateur nonnumérique
: fichier n’appartenant à aucun utilisateur non numérique
-group groupe : fichier appartenant au groupe
-group groupe : fichier appartenant au groupe indiqué indiqué
-nogroup
-nogroup: : fichier
fichiern’appartenant
n’appartenantààaucun
aucungroupe
groupenonnonnumérique
numérique
-size
-sizenn : : Fichier
Fichierutilisant
utilisantnnblocks.
blocks.
-print
-printaffiche
affichelelenom
nomcomplet
completdu dufichier
fichiersur
surlalasortie
sortiestandard
standard
-ls
-ls affiche
affichelelenom
nomdudufichier
fichieren
encours
coursdans
dansleleformat
format‘ls
‘ls–dils’
–dils’
-exec
-execcmd
cmd: :exécute
exécutelalacommande
commandejusqu’à
jusqu’àce
cequ’on
qu’onrencontre
rencontreunun‘ ‘;’,;’,
La
Lachaîne
chaîne\{\{\}\}est
estremplacée
remplacéepar
parlelenom
nomdu
dufichier
fichieren
encours
cours
de
detraitement
traitement
-ok
-okcomme
comme-exec
-execmais
maisinterroge
interroged’abord
d’abordl’utilisateur
l’utilisateur(demande
(demandede
deconfirmation)
confirmation)
Exemple 3 :chercher les liens symboliques qui se nomment local dans /usr
Exemple 3 :chercher les répertoire qui ne sont pas accessible dans /usr
1: écran
0: clavier
Processus 2: écran
-n-n–numeric-sort
–numeric-sort dans
dansl’ordre
l’ordrenumérique
numérique
-d-d–dictionary-order
–dictionary-order dans
dansl’ordre
l’ordrealphabétique
alphabétique
-t-tcar
car lelecaractère
caractèreséparateur
séparateurde dechamps
champs
-k-k lelechamps
champsconsidéré
considérépourpourleletritri
-o-ofichier
fichier lelerésultat
résultatest
estmis
misdans
dansfichier
fichier
-u-u efface
effacetoutes
toutesles
leslignes
lignessauf
saufuneunequiquiont
ontlalamême
mêmeclé
clé
Fusionner
Fusionnerlesleslignes
lignesdededeux
deuxfichiers
fichiersayant
ayantun
unchamp
champcommun
commun
-j1
-j1nn jointure
jointuresursurnième
nièmechamp
champdu dupremier
premierfichier
fichier
-j2
-j2nn jointure
jointuresursurnième
nièmechamp
champdu dudeuxième
deuxièmefichier
fichier
-t-tcar
car lelecaractère
caractèreséparateur
séparateurde
dechamps
champs
Son utilité :
automatisation d’actions
Contrôle de flux d’execution
utilisation de structures plus avancées :
9 boucles
9 Tests
9 ...
4. Exécuter le script
$ ./nom_script_shell
N.ABGHOUR UNIX AVANCE
Exemple : Structure d’un script shell
#!
#! Sur
Surlalapremière
premièreligne
ligne: :interpréteur
interpréteurduduprésent
présentscript
script
(# ! suivi du chemin complet du shell utilisé
(# ! suivi du chemin complet du shell utilisé plus plus
d’éventuels
d’éventuelsarguments)
arguments)
## commentaires
commentairesLes Lesligne
lignededecommentaire
commentairesont sont
précédées
précédéesde de##
code
code Le
Lecode
codeest
estdonné
donnéligne
lignepar
parligne
ligne
$$ cat
cat script3.sh
script3.sh
#!/bin/sh
#!/bin/sh
echo
echo "Nombre
"Nombre dede parametres
parametres == "" $#$#
echo
echo "Paramètre
"Paramètre numéro
numéro 00 == "" $0
$0
echo
echo "Paramètre
"Paramètre numéro
numéro 11 (nom
(nom dudu répertoire)
répertoire) == "" $1
$1
echo
echo
echo
echo "No
"No du
du processus
processus en
en cours
cours ($0)
($0) == $$"
$$"
mozilla
mozilla &&
echo
echo "No
"No du
du dernier
dernier processus
processus en en background
background (mozilla)=
(mozilla)= $!"
$!"
echo
echo
date
date
echo
echo "Nombre
"Nombre dede fichiers
fichiers dans
dans lele repertoire
repertoire $1
$1 =";ls
=";ls $1|
$1| wc
wc -w
-w
$ ./script3.sh /etc
Nombre de parametres = 1
Paramètre numéro 0 = ./script3.sh
Paramètre numéro 1 (nom du répertoire) = /etc
. . . . . . .
$$ cat
cat script3.sh
script3.sh
#!/bin/sh
#!/bin/sh
ls
ls
echo
echo "exemple
"exemple code
code de
de retour
retour OK
OK (ls)=
(ls)= $? $? ""
ls
ls toto
toto
echo
echo "exemple
"exemple code
code de
de retour
retour KO
KO == $?
$? ""
$ ls
chat chien
$ ./script3.sh
chat chien
exemple code de retour OK (ls)= 0
toto : no sush file or directory
exemple code de retour KO = 1
$
$$ cat
cat script4_vrai.sh
script4_vrai.sh
## !/bin/sh
!/bin/sh
echo
echo $1
$1 $2
$2 $3
$3 $4
$4 $5
$5 $6
$6 $7
$7 $8
$8 $9
$9 ${10}
${10} ${11}
${11} ${12}
${12} exit
exit 00
for i in $*
for i in $*
⇔
do
do
echo $1
echo $i
shift
done
done
$ cat test_read
# !/bin/sh
echo ’Quel est ton nom ?’
read nom
echo "Bonjour $nom"
exit 0
$ ./test_read
Quel est ton nom?
Toto
Bonjour Toto
$
$$ cat
cat calcul.sh
calcul.sh
#!/bin/sh
#!/bin/sh
C="abc"
C="abc"
N=12
N=12
echo
echo "variable
"variable CC == "" ${C}
${C}
echo
echo "variable
"variable NN == "" ${N}
${N}
echo
echo –e–e "variable
"variable N+1N+1 == \c"
\c" ;; expr
expr ${N}
${N} ++ 11
N=‘expr
N=‘expr ${N}
${N} ++ 10‘
10‘
echo
echo "variable N apres
"variable N apres N=N+10=
N=N+10= "" ${N}
${N}
$$ ./calcul.sh
./calcul.sh
variable
variable CC == abc
abc
variable
variable NN == 1212
variable
variable N+1N+1 == 13
13
variable
variable N apres N=N+10=
N apres N=N+10= 2222
Exemple :
$v=10
$v=10
$x=20
$x=20
$$(($v+$x))
$$(($v+$x))
30
30
$$(($x*$v))
$$(($x*$v))
200
200
$ cat test_exec $ sh
#!/bin/sh $ exec 1> /tmp/out
read cmd $ date
exec $cmd $ echo bonjour
echo ligne 1 $ exit
echo ligne 2 $cat /tmp/out
$ test_exec 25-11-2010
date bonjour
25-11-2010 $
$
N.ABGHOUR UNIX AVANCE
Commande : eval
eval commande
La
Lacommande
commandeest
estinterprétée
interprétéepuis
puislelerésultat
résultatde
del’interprétation
l’interprétationest
estexécuté
exécuté
$ cat test_eval
#!/bin/sh
read cmd
# supposons que l’utilisateur saisisse « /etc/passwd"
# Exemple
# 1) interprétation de "file $cmd" --> « wc -l /etc/passwd »
# 2) execution de « wc –l /etc/passwd »
eval " wc –l $cmd"
# Ce qui suit est exécuté
echo fin
$ ./test_eval
/etc/passwd
100
fin
$
N.ABGHOUR UNIX AVANCE
Commandes de test : test, [
test expression ou [ expression ]
permet
permetd’évaluer
d’évaluerune
uneexpression.
expression.
••Si
Sivrai,
vrai,renvoie
renvoie0,
0,sinon,
sinon,renvoie
renvoie1.
1.
••S’il
S’iln’y
n’yaapas
pasd’expression,
d’expression,renvoie
renvoie11(false).
(false).
test
testexpression
expressionest estéquivalent
équivalentàà [[expression
expression]]
-d-dficfic ÆÆ vrai
vraisisilelefichier
fichierexiste
existeetetest
estun
unrépertoire
répertoire
-f-f fic
fic ÆÆ vrai
vraisisilelefichier
fichierexiste
existeetetest
estun
unfichier
fichier««ordinaire»
ordinaire»
-h-hficfic ÆÆ vrai
vraisisilelefichier
fichierexiste
existeetetest
estun
unlien
liensymbolique
symbolique
-x fic
-x fic ÆÆ vrai
vrai si le fichier existe et est autoriséen
si le fichier existe et est autorisé enexécution
exécution
-w fic
-w fic ÆÆ vrai si le fichier existe et est autorisé en écriture
vrai si le fichier existe et est autorisé en écriture
-r-rfic
fic ÆÆ vrai
vraisisilelefichier
fichierexiste
existeetetest
estautorisé
autoriséen enlecture
lecture
ch1 = ch2 Æ
ch1 = ch2 Æ vrai si les deux chaînes sont identiques
vrai si les deux chaînes sont identiques
ch1
ch1!= ch2 Æ
!=ch2 Æ vrai
vraisisiles
lesdeux
deuxchaînes
chaînessont
sontdifférentes
différentes
n1 -eq n2
n1 -eq n2 Æ Æ sisiles
les deux nombres sont numériquementégaux
deux nombres sont numériquement égaux
n1n1-ne -nen2n2 ÆÆ sisiles deux nombres sont numériquement
les deux nombres sont numériquement inégaux inégaux
n1 -lt
n1 -lt n2n2 ÆÆ sisin1
n1estestnumériquement
numériquementinférieur
inférieurààn2n2
n1 -gt
n1 -gt n2 n2 ÆÆ sisin1
n1 est numériquement supérieur àn2
est numériquement supérieur à n2
if
if [[ -d
-d toto
toto ];
];
then
then echo
echo "toto
"toto est
est un
un répertoire"
répertoire"
elif
elif [[ -h
-h toto
toto ];];
then
then echo
echo "toto
"toto est
est un
un lien
lien symbolique"
symbolique"
else
else echo
echo "faut
"faut pousser
pousser l’investigation
l’investigation plus
plus loin"
loin"
fi
fi
Exemple 2 :
if
if ls
ls file
file >> /dev/null
/dev/null 2>&1
2>&1
then
then echo
echo "la
"la commande
commande ls
ls file
file aa réussi"
réussi"
else echo "la commande ls file a
else echo "la commande ls file a échoué"échoué"
fi
fi
Exécute
Exécutelalaliste-commandes
liste-commandessuivant
suivantlelemotif
motifreconnu.
reconnu.
Le
Lemotif
motifààreconnaitre
reconnaitrepeut
peuts’exprimer
s’exprimersous sous forme
formed’expression
d’expressionrationnelle
rationnelle
utilisant
utilisantles
lesméta-caractères
méta-caractères:*:*??[ [] ]--
La
Lavariable
variableprend
prendsuccessivement
successivementles
lesvaleurs
valeursde
delalaliste
listede
demots,
mots,et
et
pour
pourchaque
chaquevaleur,
valeur,liste-commandes
liste-commandesest
estexécutée.
exécutée.
$$ cat
cat test_for1
test_for1 $$ cat
cat test_for2
test_for2
for
for ii in
in un
un deux
deux trois
trois quatre
quatre for
for ii in
in /etc/f*
/etc/f*
do
do do
do
echo
echo "chapitre
"chapitre $i"$i" echo
echo $i
$i
done
done done
done
$ ./test_for1 $ ./test_for2
chapitre un /etc/fbtab
chapitre deux /etc/fstab
chapitre trois /etc/ftpusers
chapitre quatre
La
Lavaleur
valeurtestée
testéepar
parlalacommande
commandewhile whileest
estl’état
l’étatdedesortie
sortiede
delaladernière
dernièrecommande
commande
de liste-commandes-1.
de liste-commandes-1.
Si
Sil’état
l’étatde
desortie
sortieest
est0,0,alors
alorsleleshell
shellexécute
exécuteliste-commandes-2
liste-commandes-2
puis
puisrecommence
recommencelalaboucle.
boucle.
Le
Leshell
shellteste
testel’état
l’étatde
desortie
sortiede
deliste-commandes-1.
liste-commandes-1.
Si
Sil’état
l’étatde
desortie
sortieest
est1,
1,alors,
alors,liste-commandes-2
liste-commandes-2 est
estexecutée
executéepuis
puislala
boucle
boucleest estrecommencée.
recommencée.
break ou break n
permet
permetdedesortir
sortird’une
d’uneboucle
bouclefor,
for,while
whileououuntil.
until.
Si
Sinnest
estprécisé,
précisé,ililindique
indiquelelenombre
nombred’imbrication
d’imbricationconcernée
concernéepar
parlelebreak.
break.
continue n
permet
permetdedepasser
passerààl’itération
l’itérationsuivante
suivanted’une
d’uneboucle
bouclefor,
for,while
whileou
ouuntil.
until.
Si
Sinnest
estprécisé,
précisé,ililindique
indiquelelenombre
nombred’imbrication
d’imbricationconcernée
concernéeparparlelecontinue.
continue.
$ ./test_set-x
+echo /home/nabghour
/home/nabghour
return n
Renvoie
Renvoieune
unevaleur
valeurde
deretour
retourpour
pourlalafonction
fonctionshell.
shell.
exit n
Provoque
Provoquel’arrêt
l’arrêtdu
dushell
shellcourant
courantavecavecununcode
coderetour
retourde
dennsicelui-ci
sicelui-ciest
est
spécifié.
spécifié.S’il
S’iln’est
n’estpas
passpécifié,
spécifié,ilils’agira
s’agirade
delalavaleur
valeurderetour
deretourde
delaladernière
dernière
commande
commandeexécutée.
exécutée.