Linux Commandes Outils
Linux Commandes Outils
Linux Commandes Outils
commandes, outils
et autres \sources" d'amusements
c Mathieu DECORE
3 novembre 1999
2
3
4
TABLE DES MATIERES
9
10 LISTE DES TABLEAUX
11
12 TABLE DES FIGURES
Chapitre 1
Bases et commandes utiles
1.1 Redirections
> / >> : redirection de la sortie standard (l'ecran) vers un chier / id
sans ecraser ;
13
14 CHAPITRE 1. BASES ET COMMANDES UTILES
d'erreurs standard.
Le tableau 7.1 page 174 presente d'autres modeles pouvant ^etre utilises.
Par ailleurs, plusieurs options peuvent ^etre utilisees. Voici quelque options
utiles de la commande grep (tableau 1.2) :
^[0-9]\{3\}$
cherche toutes les lignes contenant uniquement un nombre a 3 chires.
:[0-9]\{2,\}:
cherche toutes les lignes contenant des nombres de minimum 2 chires
avant les deux points (\ :").
^[0-9]\{1,5\}:
cherche toutes les lignes commencant par des nombres de minimum 1 a 5
chires suivits par deux points (\ :").
(une|deux) fois
cherche toutes les lignes contenant la cha^ne \une fois" ou \deux fois".
une fois
deux fois
et les lignes contenant l'un ou l'autre de ces textes seront recherchees.
Bien sur, on peut combiner les commandes cut et sort. Par exemple :
cut -d: -f3 /etc/passwd | sort -n > Nombres
Les modications a apporter sont donnees sous forme de message. Par
exemple :
{ 3a4,7 indique que apres la troisieme ligne du premier chier doivent
^etre incrustees les lignes 4 a 7 du second. Attention, les messages sui-
vants indiqueront les numeros des lignes sans tenir compte des incrus-
tations qui auront eventuellement ete apportees.
{ 5,8d4 indique que les lignes 5 a 8 du premier chier doivent ^etre sup-
primees, car elles n'existent pas derriere la ligne 4 du second.
{ 10,15c12,17 indique que les lignes 10 a 15 du premier chier doivent
^etre integralement changees contre les lignes 12 a 17 du second.
Dans les trois cas de gure, les lignes precedees du signe \<" se rapportent
au premier chier, et les lignes precedees du signe \>" se rapportent au
second.
L'option -b permet de ne pas tenir compte des espaces lors de la compa-
raison des lignes.
clavier. Par exemple, la commande suivante recherche tous les chiers dont
le nom commence par \install" :
find / -type f -name "install*" -print > liste 2> /dev/null &
Cette commande etant assez longue, on peut ainsi continuer a travailler
sur la m^eme console ou la m^eme fen^etre xterm. Pour supprimer les sor-
ties ecran, on redirige la sortie standard vers un chier, et la sortie d'erreur
standard vers le \trou noir".
Lorsqu'on lance une commande en t^ache de fond, deux numeros appa-
raissent :
[1] 439
qui indiquent les numeros de t^ache de fond et de processus. Le numero
de t^ache de fond est celui qui correspond au numero de processus en
action, qu'il tourne ou non. Si on lance une autre commande, elle aura un
autre numero de t^ache de fond :
[2] 442
Le numero de processus est le m^eme que celui qui est aÆche par la com-
mande ps, et qui sert a forcer l'arr^et d'une commande gr^ace a la commande
kill :
439 p2 D 0:02 find / -type f -name install* -print
La commande jobs permet d'aÆcher les commandes qui s'executent en
arriere plan :
[3]- Running find / -type f -name "install*"
-print >liste 2>err.moi &
L'option -l permet d'aÆcher en plus le numero de processus :
[4]+ 455 Running find / -type f -name "install*" -print
>liste 2> /dev/null &
En appuyant sur les touches Ctrl+z (ou celles denies par la ligne
\susp = " de la commande stty -a), on peut stopper l'execution d'une
commande. Elle se retrouve alors en arriere plan, comme l'indique le resultat
de la commande jobs :
[4]+ Stopped find / -type f -name "install*" -print
>liste 2> /dev/null
On peut relancer la commande en arriere plan avec la commande bg %4,
ou en avant plan avec la commande fg %4. Au lieu du numero de job, on
peut specier le numero de processus.
22 CHAPITRE 1. BASES ET COMMANDES UTILES
8 75 + 27 57 s 1
: :
144 55
: 4
Un facteur normal se situe entre 15 et 1
10
. Un facteur superieur a 1
20
traduit
une surcharge du systeme.
rwxr-xr-x
equivaut a 400 + 200 + 100 = 700 pour l'utilisateur, 40 + 10 = 50 pour le
groupe et 4 + 1 = 5 pour les autres, soit au total 700 + 50 + 5 = 755 :
chmod 755 fichier
Pour attribuer les droits d'acces par defaut, il faut executer la commande
umask et attribuer un numero particulier. Ce numero est obtenu en sous-
treyant le chire 7 a chaque chire du numero de droit d'acces. Ainsi, pour
attribuer par defaut la valeur 750 (tous les droits pour l'utilisateur, droits de
lecture et d'execution pour le groupe et aucun pour les autres), il faut fournir
a la commande umask la valeur 027 (7 7 = 0, 7 5 = 2 et 7 0 = 7) :
umask 027
Cette ligne pourra gurer dans le chier d'initialisation .bashrc pour que
ces droits soient pris en compte a chaque session.
Pour denir des droits d'acces etendus (qui permettent a un utilisateur
d'eectuer une operation sur des chiers lui appartenant, comme modier
son mot de passe par exemple), utiliser l'option +s ou rajouter les valeurs
4000 pour l'utilisateur et 2000 pour le groupe. Pour le groupe :
chmod 2755
et pour l'utilisateur :
chmod 4755
Tout utilisateur peut copier des chiers dans le repertoire /tmp/. Pour
que ces chiers ne puissent pas ^etre eaces par un autre utilisateur que celui
qui les a copies et root, il faut positionner le Sticky Bit (en tant que root,
bien s^ur) :
chmod u+t /tmp
ou
chmod 1777 /tmp
tail : permet de n'aÆcher que les dernieres lignes d'un chier. L'option -20
aÆchera les 20 dernieres lignes, et l'option +20 aÆchera les 20 premieres
lignes.
whoami / who am i / who : quel est mon login / id. avec plus d'infor-
mations / qui d'autre est logue.
ls : aÆche la liste des chiers. Les options sont nombreuses et des rac-
courcis existent pour les plus utiles (pour les conna^tre, taper alias).
Pour avoir une liste des variables d'environnement denies, taper set
pour toutes les variables, ou env pour avoir seulement la liste des variables
d'environnement.
ln -s /etc/XF86Config XF86config
a pour consequences que si on lance une commande (less, emacs. . .)
sur le chier XF86cong, c'est sur le chier /etc/XF86Config qu'elle s'eec-
tuera. Les liens sont le plus souvent symboliques (avec l'option -s).
31
32 CHAPITRE 2. UTILISATION DE XFREE86
materiel possede !
Sinon, risques de bobos pour la
carte video (Yo !).
Chaque section du chier de conguration XF86Cong commence par
Section et se termine par EndSection. La premiere section s'appelle Files :
Section "Files"
#--------------------------------------------------------------------#
# Chemins d'acces des fichiers de couleurs et de polices d'ecriture. #
#--------------------------------------------------------------------#
RgbPath "/usr/X11R6/lib/X11/rgb"
FontPath "/usr/X11R6/lib/X11/fonts/misc/"
FontPath "/usr/X11R6/lib/X11/fonts/75dpi/:unscaled"
EndSection
Il suÆt juste de verier les chemins d'acces, et que chaque police ins-
tallee (dans le repertoire /usr/X11R6/lib/X11/fonts/) est bien referencee
par une ligne FontPath (en cas de probleme, invoquer mkfontdir dans chaque
repertoire de polices).
Section "ServerFlags"
34 CHAPITRE 2. UTILISATION DE XFREE86
# NoTrapSignals
# DontZap
EndSection
La section suivante, Keyboard, concerne le clavier :
#------------------#
# Section clavier. #
#------------------#
Section "Keyboard"
Protocol "Standard"
AutoRepeat 500 5
LeftAlt Meta
RightAlt ModeShift
RightCtl Compose
ScrollLock ModeLock
XkbKeymap "xfree86(fr)"
XkbKeycodes "xfree86"
XkbTypes "default"
XkbCompat "default"
XkbSymbols "en\_US(pc101)+fr"
XkbGeometry "pc(pc101)"
EndSection
D'autres options sont disponibles. Les valeurs ci-dessus devraient conve-
nir a la plupart des claviers (m^eme francais).
Section "Pointer"
Protocol "Microsoft"
Device "/dev/mouse"
# BaudRate 9600
# SampleRate 150
# Emulate3Buttons
# Emulate3Timeout 50
# ChordMiddle
EndSection
La section suivante, Monitor, informe XFree des caracteristiques du mo-
niteur :
#-------------------#
# Section moniteur. #
#-------------------#
36 CHAPITRE 2. UTILISATION DE XFREE86
Section "Monitor"
HorizSync 31.5
# HorizSync 30-64
VertRefresh 60
# VertRefresh 50-100
# VertRefresh 60, 65
# ModeLine "640x480" 25.175 640 664 760 800 480 491 493 525
Mode "640x480"
DotClock 25.175
HTimings 640 664 760 800
VTimings 480 491 493 525
EndMode
ModeLine "1024x768i" 45 1024 1048 1208 1264 768 776 784 817 Interlace
# Mode "1024x768i"
# DotClock 45
# HTimings 1024 1048 1208 1264
# VTimings 768 776 784 817
# Flags "Interlace"
# EndMode
EndSection
Les chiers du repertoire /usr/X11R6/lib/X11/doc peuvent donner des
informations concernant les caracteristiques du moniteur, en particulier le
calcul de chaque resolution desiree dans les chiers suivants :
{ VideoModes.doc
{ modeDB.txt
{ Monitors
Les lignes ModeLine prevues pour le modele de moniteur video seront
sans doute dans ces chiers. Si rien n'est indique, le chier VideoModes.doc
permet de realiser manuellement cette conguration.
Section "Device"
Identifier "Generic VGA"
EndSection
La derniere section, Screen, specie la combinaison moniteur/carte video
d'un serveur particulier :
#---------------#
# Section ecran #
#---------------#
Section "Screen"
Subsection "Display"
Depth 8
Modes "1024x768i" "640x480"
ViewPort 0 0
Virtual 800 600
EndSubsection
EndSection
40 CHAPITRE 2. UTILISATION DE XFREE86
Before submitting a report, please make sure that you have the
latest version of SuperProbe (see http://www.xfree86.org/FAQ).
XF86Config: /etc/XF86Config
(**) stands for supplied, (--) stands for probed/default values
(**) XKB: keymap: "xfree86(fr)" (overrides other XKB settings)
2.1. INSTALLATION ET CONFIGURATION 43
Sans ces chiers, le serveur X \brut" est lance. Pour le rendre utilisable,
il faut faire appel a un window-manager (gestionnaire de fen^etres). Le plus
simple est twm, auquel il faut faire appel dans le chier .xinitrc.
De plus, les m^emes resultats peuvent ^etre obtenus en speciant des noms
de chiers contenant les options. Par exemple, si le chier pxinitrc contient
la ligne :
xclock -bg yellow -fg red -hd green
et le chier pxserverrc contient la ligne :
/usr/X11R6/bin/XF86_Mono
on peut lancer le serveur X par la commande suivante :
xinit pxinitrc -- pxserverrc
En pratique, c'est le script /usr/bin/startx qui se charge de specier
les chiers d'options pour la commande xinit. Ce script contient en derniere
ligne :
xinit $clientargs -- $serverargs
ou la variable $clientargs contient le nom le premier client, et $serve-
rargs le nom de serveur.
Parmi les applications lancees par le chier .xinitrc, il y a xterm,
l'emulation d'un terminal texte (qui permet de passer des commandes) et
oclock qui aÆche une horloge. Chaque commande est lancee en t^ache de
fond (le nom de la commande est suivit par '&') pour pouvoir garder la main
pour lancer d'autres commandes depuis le terminal (sans quoi on ne peut
plus lancer aucune commande jusqu'a la n de l'execution de la commande,
bonjour le multi-t^aches qui a fait la reputation d'UNIX !).
Ces commandes lancees au demarrage sont suivies de nombreuses options.
Les sections suivantes en presentent les principales pour quelque applications
courantes.
# default runlevel
id:2:initdefault:
egal a celui indique par la ligne xdm (si xdm se lance au niveau d'execution
4, il faut que le niveau par defaut soit 4 et non 2). Pour plus de precisions,
voir section 9.12 page 237 ou taper man inittab.
Comme la modication du chier /etc/inittab est dangereuse, on peut
passer directement au niveau souhaite, ce qui aurra pour eet de lancer les
commandes speciees pour le niveau. Ainsi, si xdm se lance en mode 4, la
commande init 4 terminera les processus en cours et lancera xdm. Comme
init attend 20 secondes avant d'arr^eter tous les processus, on peut indiquer
qu'on veut y passer tout de suite :
init -t0 4
Attention ! Dans cet exemple, on a pris un niveau 4 pour xdm. Il se peut
que ce ne soit pas le niveau 4 qui soit specie dans le chier /etc/inittab. Il
faut donc bien specier le niveau d'execution indique dans le chier
/etc/inittab. . .
Parmis les modes d'aÆchage, les suivants meritent d^etre essayes2 : bounce,
bat, cartoon, clock, eyes, galaxy, hyper, image, nose, pyro, world.
2 Il y en a plus de 40 au total.
50 CHAPITRE 2. UTILISATION DE XFREE86
Pour avoir la liste des autres modes, on peut invoquer xlock -help, que
l'on peut visualiser avec la commande less (xlock -help | less) ou qu'on
peut rediriger vers un chier (xlock -help >& xlock.help, attention a la
syntaxe particuiere de cette redirection).
On peut creer une nouvelle bo^te aux lettres avec l'option Create Folder
dans le menu Folder. Entrer un nom et valider, puis cliquer sur son nom de
la nouvelle bo^te aux lettres (dans l'ovale). L'avantage des plusieurs bo^te aux
lettres est que l'on peut y classer les courriers. Pour y deplacer un message,
choisir Move puis Commit Changes dans le menu Messages. On peut verier
que le message a bien ete deplace par l'option Open Folder dans le menu
Folder.
12x24romankana
5x7
5x8
6x10
6x12
6x13
6x13bold
6x9
7x13
7x13bold
7x14
7x14bold
8x13
8x13bold
8x16
8x16kana
8x16romankana
9x15
9x15bold
Enn, la commande xfd permet d'aÆcher une police particuliere, par
exemple :
xfd -fn *-helvetica-*-24-*
Note sur le presse-papier : l'application xclipboard permet de copier
et coller un texte selectionne dans une boite, celle qui resulte de son appel.
Pour l'utiliser, on rentre un texte qu'on selectionne avec la souris (boutton
gauche) et qu'on colle (boutton du milieu). On peut sauvegarder le contenu
du presse-papier ou simplement aÆcher son contenu par le simple appel de
cette application.
TitleFont "-adobe-helvetica-bold-r-normal--*-120-*-*-*-*-*-*"
ResizeFont "-adobe-helvetica-bold-r-normal--*-120-*-*-*-*-*-*"
MenuFont "-adobe-helvetica-bold-r-normal--*-120-*-*-*-*-*-*"
IconFont "-adobe-helvetica-bold-r-normal--*-100-*-*-*-*-*-*"
IconManagerFont "-adobe-helvetica-bold-r-normal--*-100-*-*-*"
"" f.nop
"Focus" f.focus
"Unfocus" f.unfocus
"Show Iconmgr" f.showiconmgr
"Hide Iconmgr" f.hideiconmgr
"" f.nop
"Kill" f.destroy
"Delete" f.delete
"" f.nop
"Restart" f.restart
"Exit" f.quit
}
menu "ProgrammesMenu"
{
"xearth" f.exec "xearth -label -grid -markerfile 9x15bold &"
"Mise en veille" f.menu "Mise en veilleMenu"
"Jeux" f.menu "JeuxMenu"
menu "JeuxMenu"
{
"xabuse" f.exec "xabuse &"
}
60 CHAPITRE 2. UTILISATION DE XFREE86
XClock*Background : yellow
XClock*Foreground : red
XClock*hands : green
XClock*Font : 7x13bold
On peut ensuite donner des specications speciales a chacunes des hor-
loges, par exemple leur positions et leurs tailles (toujours dans le chier
$HOME/.Xdefaults, a la suite) :
! Definitions specifiques a chaque xclock
! Le specifications de chaque xclock l'emportent sur celles de la classe
xclock-haut*Geometry : 160x170-0-0
xclock-milieu*Geometry : 160x170-200-0
xclock-milieu*Foreground : blue
xclock-3*Geometry : 160x170-400-0
Pour appeler ces horloges, on peut inserer les lignes suivantes dans le
chier d'initialisation .xinitrc :
5 Uneclasse peut agir sur plusieurs programmes. Ainsi, la classe Clock permet de
specier des options pour les horloges xclock et oclock.
2.13. LES RESSOURCES 61
.xinitrc+
Trois horloges appara^trons en bas de l'ecran avec les couleurs, tailles et
positions stipulees par les chiers de conguration.
# Les couleurs peuvent etre specifiees par leurs noms ou par leur
# nombre en hexadecimal.
StdForeColor white
#000000
StdBackColor midnightblue
#60a0c0
HiForeColor Black
HiBackColor red
#c06077
# couleurs du pager
StickyForeColor Black
StickyBackColor #60c0a0
# couleurs du menu
MenuForeColor Black
MenuBackColor grey
Font -adobe-helvetica-medium-r-normal-*-*-120-*
WindowFont -adobe-helvetica-bold-r-normal-*-*-120-*
IconFont fixed
AutoRaise 150
# ClickToFocus
# Emulation de mwm
# MWMFunctionHints
# MWMHintOverride
# MWMDecorHints
# OpaqueMove 0
BoundaryWidth 3
DeskTopSize 6x6
DeskTopScale 50
Pager 5 -5
EdgeScroll 10 10
EdgeResistance 10 10
# RandomPlacement
NoPPosition
^
2.14. CONFIGURER UN AUTRE GESTIONNAIRE DE FENETRES : FVWM67
OpaqueMove 0
# pour que Xbiff reste toujours visible au dessus des autres fenetres
Les fen^etres peuvent ^etre mises sous la forme d'ic^ones. En voici les specications :
# Region de l'ecran ou les icones seront rangees
# coin-haut-gauche coin-bas-droite
IconFont -adobe-helvetica-medium-r-*-*-*-120-*
68 CHAPITRE 2. UTILISATION DE XFREE86
#-----------------#
# Chemins d'acces #
#-----------------#
IconPath /usr/X11R6/include/X11/bitmaps
PixmapPath /usr/X11R6/include/X11/pixmaps
ModulePath /usr/lib/X11/fvwm/
#--------#
# Styles #
#--------#
# Bouton 3 : losange.
# Bouton 5 : pentagone.
La section suivante denit les fonctions. Chacune doit ensuite ^etre associee
a un bouton ou une touche du clavier dans la section Association de boutons
et de touches plus loin dans le chier.
#-----------#
# Fonctions #
#-----------#
Function "InitFunction"
Exec "I" exec rxvt -geometry +1200+10 &
Module "I" GoodStuff
Module "I" FvwmPager 0 3
Module "I" FvwmWinList
EndFunction
Function "Move-or-Raise"
Move "Motion"
# Raise "Motion"
Raise "Click"
# RaiseLower "DoubleClick"
EndFunction
Function "maxi_fenetre"
Maximize "Click" 0 80
Maximize "Motion" 0 100
Maximize "DoubleClick" 100 100
EndFunction
# Sous-menus...
Popup "Xclients"
Title "Xclients"
Exec "xterm" exec xterm &
Nop ""
Exec "piou" exec xterm -e rlogin $HOSTNAME -l piou &
Nop ""
Exec "xcalc" exec xcalc &
Exec "xman" exec xman &
Exec "top" exec xterm -ge 72x36 -font 7x14 -T Top -n Top -e top &
EndPopup
Popup "Module"
Title "Modules"
Module "GoodStuff" GoodStuff
Module "Identify" FvwmIdent
Module "Save" FvwmSave
Module "Debug" FvwmDebug
Module "Pager" FvwmPager 0 3
Module "FvwmWinList" FvwmWinList
EndPopup
Popup "Fenetre_Opt"
Title "Options de la fenetre"
Function "Deplacer" Move-or-Raise
Function "Changer la taille" Resize-or-Raise
Raise "Au dessus"
Lower "Au dessous"
Iconify "Iconifier"
Stick "Coller"
Function "Maximum" maxi_fenetre
Nop ""
Destroy "Detruire"
Delete "Supprimer"
Nop ""
Refresh "Rafraichir l'ecran"
EndPopup
72 CHAPITRE 2. UTILISATION DE XFREE86
# Affiche un menu :
# * Xclients si on clique une fois
# * Module si on clique en bougant le souris
# Ferme la fenetre si on clique deux fois
Function "Opt_fenetre"
Popup "Click" Xclients
Popup "Motion" Module
Delete "DoubleClick"
EndFunction
Ces menus peuvent ^etre inseres dans un autre (avec la fonction Popup),
comme par exemple le menu principal :
Popup "Fvwm"
Title "Fenetres"
Move "Deplacer"
Resize "Changer la taille"
Raise "Au dessus"
Lower "Au dessous"
Iconify "Iconifier"
Stick "Coller"
Nop ""
Popup "Xclients" Xclients
Nop ""
Popup "Module" Module
Nop ""
Destroy "Detruire"
Delete "Supprimer"
Nop ""
Refresh "Rafraichir l'ecran"
Exec "Charger Xdefaults" exec xrdb -load $HOME/.Xdefaults
Restart "Relancer Fvwm" fvwm
Restart "Lancer twm" twm
Quit "Quitter Fvwm"
EndPopup
^
2.14. CONFIGURER UN AUTRE GESTIONNAIRE DE FENETRES : FVWM73
#---------#
# Modules #
#---------#
Function "barthiswmpopupfunc"
Popup "I" "Xclients"
EndFunction
Popup "bargraphicpopup"
Title "Graphics"
Exec "XFig" xfig
Exec "Gimp" gimp
Exec "XPaint" xpaint
Exec "TGif" tgif
Exec "ImageMagick" xterm -iconic -e display
EndPopup
Popup "bartoolspopup"
Title "Tools"
# take knews, if not trn, if not, nothing
# user installed software
Exec "TkDesk" tkdesk
Exec "TkMan" tkman
Exec "Xman" xman
Nop ""
Function "Netscape" NSFunc
EndPopup
Popup "barshellpopup"
Title "Shells"
Exec "Shell in XTerm" xterm -e bash -login
Function "Root shell" RootShell
EndPopup
*GoodStuffFont 6x13
76 CHAPITRE 2. UTILISATION DE XFREE86
*GoodStuffFore Black
*GoodStuffBack grey67
*GoodStuffGeometry +0+0
*GoodStuffRows 1
*FvwmIdentBack MidnightBlue
*FvwmIdentFore Yellow
*FvwmIdentFont -misc-fixed-medium-r-normal--13-120-75-75-c-80-iso8859-1
*FvwmPagerBack pink
*FvwmPagerFore #908090
*FvwmPagerFont -misc-fixed-medium-r-normal--7-70-75-75-c-50-iso8859-1
*FvwmPagerHilight #cab3ca
*FvwmPagerGeometry -1+380
*FvwmPagerLabel 0 "Bureau Principal"
*FvwmPagerLabel 1 Mail
*FvwmPagerLabel 2 Programmation
*FvwmPagerSmallFont -misc-fixed-medium-r-normal--7-70-75-75-c-50-iso8859-1
# Liste des fenetres ou icones actuellement ouvertes sur toutes les pages
# sur tous les bureaux virtuels.
*FvwmWinListBack #908090
*FvwmWinListFore Black
*FvwmWinListFont -misc-fixed-medium-r-normal--10-100-75-75-c-60-iso8859-1
^
2.14. CONFIGURER UN AUTRE GESTIONNAIRE DE FENETRES : FVWM77
Function "bargraphicpopupfunc"
Popup "I" bargraphicpopup
EndFunction
Function "bartoolspopupfunc"
Popup "I" bartoolspopup
EndFunction
Function "barshellpopupfunc"
Popup "I" barshellpopup
EndFunction
Function "MenuOrIconify"
Popup "Click" WindowOps
Raise "Motion"
Move "Motion"
Iconify "DoubleClick"
EndFunction
Popup "bargraphicpopup"
Title "Graphics"
Exec "XFig" xfig
Exec "Gimp" gimp
Exec "XPaint" xpaint
Exec "TGif" tgif
Exec "ImageMagick" xterm -iconic -e display
EndPopup
Popup "bartoolspopup"
Title "Tools"
78 CHAPITRE 2. UTILISATION DE XFREE86
Nop ""
Function "Netscape" NSFunc
EndPopup
Popup "barshellpopup"
Title "Shells"
Exec "Shell in XTerm" xterm -e bash -login
Function "Root shell" RootShell
EndPopup
xterm -bg pink -fg red -sb -fn 9x15bold -ge -2-2 &
xclock -ge -2-2 -bg yellow -hd green &
exec olvwm
La commande openwin exporte et/ou positionne six variables d'environ-
nement :
{ les chemins d'acces pour les ressources des applications X : $XAPPL-
RESDIR.
{ les chiers du manuel : $MANPATH.
{ les chiers d'aide : $HELPPATH.
{ les chiers de base d'Openwin : $OPENWINHOME.
{ le systeme X : $X11HOME.
{ le nom du gestionnaire de fen^etres a utiliser (qui peut ^etre olwm ou
olvwm) : $WINDOWMANAGER.
Le chier de sauvegarde du bureau virtuel .openwin-init peut ^etre edite
manuellement ou cree par openwin (dans le menu Workspace/Utilities la
commande SaveWorkspace). En voici un exemple :
$OPENWINHOME/bin/cmdtool -Wp 225 0 -Ws 590 77 -C &
un serveur X, et ici utilise comme chier de sauvegarde du bureau virtuel. Il vaut mieux
n'utiliser que le chier .openwin-init pour congurer le bureau.
80 CHAPITRE 2. UTILISATION DE XFREE86
Menu "DefaultRootMenu"
{
9 Si il existe deja, il sera ecrase.
2.16. CONFIGURER MWM 83
menu "ProgrammesMenu"
{
"xearth" f.exec "xearth -label -grid -markerfile 9x15bold &"
"Mise en veille" f.menu "MiseEnVeilleMenu"
"Jeux" f.menu "JeuxMenu"
menu "MiseEnVeilleMenu"
{
"bat" f.exec "xlock -nolock -mod bat &"
"bounce" f.exec "xlock -nolock -mod bounce &"
"world" f.exec "xlock -nolock -mod world &"
}
menu "JeuxMenu"
{
"abuse" f.exec "abuse &"
}
Button DefaultButtonBindings
84 CHAPITRE 2. UTILISATION DE XFREE86
{
<Btn1Down> icon|frame f.raise
<Btn3Down> icon|frame f.post_wmenu
<Btn3Down> root f.menu RootMenu
<Btn1Up> icon f.normalize
}
Mwm*keyboardFocusPolicy : pointer
Mwm*useIconBox : True
Mwm*iconBoxGeometry : -0+0
Mwm*useClientIcon : False
Mwm*xterm*iconImage : /home/xterm.icon
Chapitre 3
Applications graphiques sous
XFree86
Les images comme les ic^ones par exemple, sont sous forme de chiers
bitmap (avec l'extension .xbm) ou pixmap (avec l'extension .xpm). Les
sections suivantes presentent ces deux types de chiers images, ainsi que les
dierentes facons de les construires ou de les modier.
85
86 CHAPITRE 3. APPLICATIONS GRAPHIQUES SOUS XFREE86
" ",
" ........................... ",
" .XXXXXXXXXXXXXXXXXXXXXXXXXXX. ",
" .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXoo ",
" OOOOOOOOOO .XXOOO++++++++++++++++++++XXXXoo ",
" OOOOOOOOOO .XOOO++++++++++++++++++++++XXXooo ",
" OOOOOOOOOO .OOO+@@+@++@+@@@@++@+++++++XXXooo ",
" OOOOOOOOOO OOO++++++++++++++++++++++++XXXoooo ",
" OOOOOOOOOO OOOX++@@@@+@@+@@@+++++++++++XXXoooo ",
" OOOOOOOOOO OOOXX++++++++++++++++++++++++XXXooooo ",
" OOOOOOOOOO OOO.XX++@@@@@@@@@@+@@@@@++++++XXXooooo ",
" OOOOOOOOOO OOO .XX++++++++++++++++++++++++XXXooooo ",
" OOOOOOOOO OOO .XX++@@@+@@@@+@@++@@@++++++XXXooooo ",
" OOOOOOO OOO .XX++++++++++++++++++++++++XXXooooo ",
" OOOOO OOOO .XX++@+++++++++++++++++++++XXXooooo ",
" OOO OOOOOO .XX++++++++++++++++++++++++XXXooooo ",
" OOO OOOOOOOO .XX++@@@@+@+@@@+@++++++++++XXXooooo ",
" OOO OOOOOOOOOO.XX++++++++++++++++++++++++XXXooooo ",
" OOO OOOOOOOOOOXX++@+@@@@++++++++++++++++XXXooooo ",
" OOO OOOOOOOOOOXX++++++++++++++++++++++XXXXoooo ",
" OOO OOOOOOOOOOXXXXXXXXXXXXXXXXXXXXXXXXXXXooo ",
" OOO OOOOOOOOOOXXXXXXXXXXXXXXXXXXXXXXXXXooo ",
" OOO OOOOOOOOOOoooooooooooooooooooooooo...oo ",
" OOO OOOOOOOOOO.........................ooo ",
" OOO OOOOOOOOOOooooooooooooooooooooooooooo ",
" OOO OOOOOOOOOOXXXXXXXXXXXXXXXXXXXXXXoooo.. .. ",
" OOO oXXXXXXXXXXXXXXXXXX#######XXoooo . .",
" oooooooooooooooooooooooooooXXXooo . ",
" oXXXXXXXXXXXXXXXXXXXXXXXXXXooooo . ",
" oXXXXXXXXXXXXXXXXXXXXXXXXXXoo oooooo ",
" oXX@@@@@@@@@@@@@@@@@@@XXXXXoo ooooo...o ",
" oXXXXXXXXXXXXXXXXXXXXXXXXXXoo ooXXXoo..o ",
" oXX@@@@@@@@@@@@@@@@@@@@XXXXoo oXXXXX..o ",
" oXXXXXXXXXXXXXXXXXXXXXXXXXXoo o.....oo ",
" oooooooooooooooooooooooooooo ooooooo ",
" ",
" "};
Les commentaires sont compris entre \/*" et \*/". Ce chier a une largeur
de 64 points, une hauteur de 38 points, il a 8 couleurs et un caractere par
point.
3.3. LES FORMATS DE FICHIERS GRAPHIQUES 91
Image: /usr/share/ghostscript/4.03/examples/tiger.ps
class: PseudoClass
colors: 39
0: ( 0, 0, 0) #000000 black
1: ( 51, 51, 51) #333333 gray20
2: ( 76, 0, 0) #4c0000
3: (102,102,102) #666666 gray40
4: (102,153, 0) #669900
5: (153, 38, 0) #992600
6: (165, 25, 38) #a51926
7: (165, 38, 76) #a5264c
8: (178, 51, 89) #b23359
9: (178,102,102) #b26666
10: (204, 63, 76) #cc3f4c
11: (204,114, 38) #cc7226
12: (232,127, 58) #e87f3a
13: (255,114,127) #ff727f
14: (229,102,140) #e5668c
15: (153,204, 51) #99cc33 ~OliveDrab3
16: (234,140, 77) #ea8c4d
17: (234,142, 81) #ea8e51
18: (235,149, 92) #eb955c
19: (236,153, 97) #ec9961
20: (238,165,117) #eea575
21: (239,170,124) #efaa7c
22: (153,153,153) #999999 gray60
23: (178,178,178) #b2b2b2 ~gray70
24: (229,153,153) #e59999
25: (241,178,136) #f1b288
26: (242,184,146) #f2b892
27: (243,191,156) #f3bf9c
28: (244,198,168) #f4c6a8
29: (245,204,176) #f5ccb0
30: (229,229,178) #e5e5b2
31: (204,204,204) #cccccc gray80
32: (248,216,196) #f8d8c4
33: (248,220,200) #f8dcc8
34: (249,226,211) #f9e2d3
35: (250,229,215) #fae5d7
L'ECRAN
3.4. LA CAPTURE DE FICHIERS IMAGE A 93
code d'identication (tel qu'il est obtenu avec la commande xwininfo,
par exemple) :
xwd -frame > image1.xwd -name xterm
Pour retarder la capture de l'ecran (pour un menu qui n'est pas xe ou
si la fen^etre n'apparait pas completement sur l'ecran, par exemple), il
faut utiliser la commande sleep juste avant :
sleep 5; xwd -frame > image1.xwd -id 0xc00023
dans cet exemple, il y aura un delai de 5 secondes avant la capture de
la fen^etre.
Pour voir le resultat, utiliser la commande xwud avec l'option -in :
xwud -in image1.xwd &
{ la commande import, appartenant a l'ensemble de programmes Ima-
geMagick. L'image de la capture peut ^etre dans dierents formats,
determines par l'extension du nom du chier (la plupart des princi-
paux formats sont possibles, ce qui evite une conversion de format de
chier). Par exemple :
import image1.gif
On peut cliquer sur une fen^etre ou bien selectionner la zone desiree :
en cliquant sur un endroit, faire glisser la souris et l^acher le bouton
(\appuyer-glisser-l^acher"). Comme pour xwd, on peut specier un nom
de fen^etre ou un code d'identication avec la m^eme option -window 2 :
import -window 0xc00023 image1.gif
Enn, l'option -delay permet d'attendre un certain nombre de secondes
avant la capture (5 secondes dans l'exemple qui suit) :
import -delay 5 -window 0xc00023 image1.gif
Pour les gestionnaires de fen^etres comme mwm ou olwm, il existe des
commandes comme snapshot presentant un menu interactif.
programmes suivants :
import capture d'une partie ou de la totalite de l'image de l'ecran
identify identication et description du format d'un ou de plusieurs chiers
image
convert conversion d'un chier image d'un format dans un autre
display aÆchage, manipulation et traitement des chiers image
animate aÆchage d'une sequence d'image
montage creation d'un ensemble d'images, compose a partir de plusieurs
autres images
mogrify traitement d'une image ou d'une sequence d'images
combine creation d'une image par combinaison de plusieurs autres images
segment segmentation d'une image
xtp recuperation, aÆchage ou impression de chiers image en provenance
d'un site eloigne, par l'intermediaire d'un reseau, ou envoi dans le reseau
de tels chiers
La principale commande est donc display, qui permet l'aÆchage du
contenu d'un chier image. Par exemple :
display image1.gif &
En cliquant avec le bouton gauche de la souris sur l'image, on obtient le
menu principal. Les options suivantes permettent de specier la position et
la taille de la fen^etre :
display -geometry 420x315+720+133 image1.gif &
et les options suivantes permettent de specier la taille de la fen^etre en
reduction et en agrandissement3 :
display -geometry 80%x80% image1.gif &
Les commandes qui suivent permettent respectivement d'extraire une par-
tie de l'image (avec l'option -crop) et d'ajouter une bordure autour de l'image
(avec l'option -border, ici de 15 pixels sur les cotes verticaux et 25 pixels sur
les cotes horizontaux), de couleur rouge (speciee par l'option -bordercolor) :
display -crop 150x120+12+30 image1.gif &
display -border 15x25 -bordercolor red image1.gif &
3 On aurait pu sp
ecier-geometry 80%, qui est equivalent a l'option -geometry 80%x80%,
puisque les deux specications sont identiques.
96 CHAPITRE 3. APPLICATIONS GRAPHIQUES SOUS XFREE86
3.5.2 xv
Le programme xv permet d'aÆcher des images, de convertir des for-
mats. . .Pour obtenir le menu cliquer sur le bouton droit de la souris.
Une fois une image aÆchee, on peut connaitre les coordonnees du point et
la couleur (aÆchee en hexadecimal) ou le niveau de gris (pour les images en
4 Attention !
Les chiers sont ecrases ! Toute modication est donc irreversible. Faire
des sauvegardes des chiers avant de les passer a cette commande. . .
3.6. AUTRES CHOSES UTILES QUAND ON FAIT DU X 97
noir et blanc). Pour aÆcher une image en fond d'ecran, selectionner l'une des
options root du menu display. Ce logiciel est un shareware, il faut l'enregistrer
pour une utilisation courante (a titre commercial).
3.5.3 xg
Le programme xfig permet de charger des chiers au format special xg
(*.g), au format LATEX, GIF, EPS. . .Ce programme permet de realiser toute
sorte de gures, diagrammes, shemas, dessins, et de les convertires dant un
format utilisable par LATEX. De nombreux exemples (*.g) montrent qu'avec
un peu d'experience, on peut realiser des dessins impressionnants (gure 3.4).
Pour gs et xdvi, il faut utiliser des options speciales (on peut les
denires comme des alias). En eet, ils sont souvent congures pour
un papier de taille anglo-saxonne. Ces options sont les suivantes :
gs -sPAPERSIZE=a4
xdvi -paper a4
ghostview -a4
Et pour que dvips convertisse les documents dans un format papier
A4, il faut specier dans le chier config.ps :
@ a4 210mm 297mm
@+ ! %%DocumentPaperSizes: a4
@+ %%PaperSize: a4
@+ %%BeginPaperSize: a4
@+ a4
{ Le programme xearth aÆche une zolie Terre en fond d'ecran. Voici
comment la lancer encore plus belle :
xearth -label -grid -wait 60 +pos ``sunrel 20 -30'' &
{ Le programme xload aÆche la charge du systeme. Voici quelque options
qui devraient ravire grands et petits :
xload -update 5 -scale 2 -jumpscroll 8 &
ou -update indique l'intervalle en secondes entre chaque remise a jour
(10 par defaut), -scale indique l'echelle initiale de charge moyenne (1
unite par defaut), et -jumpscroll indique de combien de pixels il doit
^etre deplace a chaque fois qu'il touche la limite droite de la fen^etre (la
moitie de la largeur de la fen^etre par defaut).
Chapitre 4
Outils
4.1 Emacs
Dans la documentation d'Emacs, la touche Ctrl est remplacee par
la touche C , et la touche Alt par la touche M . De plus appuyer en
m^eme temps sur la touche Ctrl et c est symbolise par C-c. C'est cette
convention qui sera utilisee dans ce document.
Pour ouvrir un chier, taper C-x C-f et saisir le nom du chier (la
completion fonctionne, c'est a dire que si on appyuie sur la touche Tab , le
nom du chier sera complete comme dans le shell). Si plusieurs chiers sont
ouverts en m^eme temps, pour passer de l'un a l'autre taper C-x b et saisir le
nom du chier. C-x C-b permet d'aÆcher la liste de tous les chiers ouverts.
C-x o permet de passer d'une fen^etre a l'autre, et C-x 1 permet de n'aÆcher
plus qu'une fen^etre, celle dans laquelle se trouve le curseur. C-x k permet de
supprimer un tampon de la memoire.
99
100 CHAPITRE 4. OUTILS
4.1.3 Macro-instructions
On peut denir des macro-instructions, comme pour mettre une ma-
juscule en debut de ligne (avec M-c). Pour cela, il faut :
{ presser C-x (
{ se placer en debut de ligne.
{ taper M-c
{ passer a la ligne suivante.
{ presser C-x )
Pour appeller cette macro, taper C-x e.
4.1.4 Indentation
Pour indenter un chier source par exemple, il faut :
1. selectionne la region par C-SPACE
2. taper M-w puis M-C-\
4.1. EMACS 101
; if () {
; }
;
; et met le curseur entre les parantheses ("backward-char 6", revient
; 6 caracteres en arriere).
(defun start-if-block()
(interactive)
(insert "if () {\n}\n")
(backward-char 6)
)
(global-unset-key "\C-r")
(global-set-key "\C-r" 'overwrite-mode)
;; Nouveaux modes
(autoload 'c++-mode "cplus-md" "C++ Editing Mode" t)
(autoload 'perl-mode "perl-mode" "Perl Editing Mode" t)
(autoload 'c-mode "c-mode" "C Editing Mode" t)
; mieux vaudrait utiliser le "cc-mode"
("\.H$" . c++-mode)
("\.cc$" . c++-mode)
("\.C$" . c++-mode)
("\.pl$" . perl-mode) ;; Perl
("/tmp/snd\.[0-9]*" . text-mode);; Text (pour le mail)
("[Rr][Ee][0-9]*" . text-mode)
("\.ada$" . ada-mode) ;; Ada
("\.spec$" . ada-mode)
("\.body$" . ada-mode))
auto-mode-alist))
# Remapes varies
(global-set-key "\eg" 'goto-line) ;; ESC G = Goto line
(global-set-key "\eo" 'overwrite-mode)
;; Accents...
(standard-display-european 1)
(load-library "iso-syntax")
emacs -bg ivory -fg slateblue -ms orange -cr brown memo.tex &
Pour lancer xemacs, la version \souris" de Emacs, il faut utiliser l'option
-mc pour la couleur du curseur :
xemacs -bg ivory -fg slateblue -mc orange -cr brown memo.tex &
La souris fonctionne d'une facon particuliere avec le bouton droit : on
selectionne d'abord le debut de la zone avec un clic sur le bouton gauche, en-
suite on peut selectionner une zone de texte par un simple clic sur le bouton
droit de la souris a tout autre endroit du texte, puis couper avec un second
clic sur le bouton droit. On peut ensuite, comme dans une fen^etre xterm,
coller par un clic sur le bouton du milieu de la souris.
Les couleurs peuvent ^etre modiees au cours d'une session Emacs, ce qui
facilite les essais. La liste des couleurs disponibles peut ^etre obtenue avec la
commande showrgb :
showrgb | less
De m^eme, on peut facilement trouver toute sorte de couleurs dierentes
portant un nom similaire (et donc une teinte semblable). Par exemple, pour
trouver tous les oranges disponibles, taper :
showrgb | grep orange
Le resultat devrait ressembler a ca :
255 165 0 orange
255 140 0 dark orange
255 69 0 orange red
255 165 0 orange1
238 154 0 orange2
205 133 0 orange3
139 90 0 orange4
On peut denir de nouvelles couleurs, voir section ?? page ??. Par exemple,
pour acceder aux changements de couleurs, il faut presser M-x puis ta-
per set-background-color pour changer la couleur de fond et valider par
Enter . Attribuer alors une nouvelle couleur. On peut tout aussi bien entrer
set-foreground-color, set-cursor-color ou set-mouse-color a la place
de set-background-color. Les couleurs peuvent dierencier les mots-clefs
en programmation C par exemple. Ainsi si on met dans le chier .emacs le
code suivant :
(add-hook 'c-mode-hook '(lambda () (font-lock-mode 1)))
(add-hook 'c++-mode-hook '(lambda () (font-lock-mode 1)))
(add-hook 'lisp-mode-hook '(lambda () (font-lock-mode 1)))
(add-hook 'emacs-lisp-mode-hook '(lambda () (font-lock-mode 1)))
en C les commentaires, les fonctions. . .n'apparaitront pas de la m^eme cou-
leur. Chaque chier edite par Emacs se terminant par le suÆxe .c aura droit
a ce traitement.
4.1. EMACS 107
Pour changer les modes d'aÆchages des caracteres, presser M-x puis ta-
per list-faces-display pour faire apparaitre la liste des dierentes teintes
utilisees. Pour en changer, proceder comme pour l'exemple qui suit :
1. Entrer M-x set-face-background
2. taper modeline
3. taper lemonchiffon
Le resultat devrait apparaitre immediatement. Les autres modes d'aÆ-
chages des caracteres peuvent ^etre changes de la m^eme facon.
Pour que ces modications perdurent, on peut les indiquer dans le chier
.Xdefaults en utilisant les ressources (voir section 2.13 page 60), mais c'est
plus simple de l'editer dans le chier .emacs. Par exemple :
(set-background-color "ivory")
(set-foreground-color "slateblue")
(set-cursor-color "brown")
(set-mouse-color "orangered")
Un index peut ^etre contenu dans le chier, auquel cas il faudra appeler
la commande makeindex et relancer latex :
latex memo.tex
makeindex memo.idx
latex memo.tex
Le resultat de la commande produit un chier dont l'extension est .dvi,
comme memo.dvi. Ce chier peut ^etre lu a l'aide de la commande xdvi ou
convertit en chier PostScript a l'aide de la commande dvips.
Des programmes tels que tktex ou lyx permettent une edition aisee des
chiers sources pour LATEX.
.SH NOM
coffee \- Controle la machine a cafe
.SH SYNOPSIS
\fBcoffee\fP [ -c | -b ] [ -t \fItype\fP ] \fInombre\fP
.SH DESCRIPTION
\fBcoffee\fP demande a la machine connectee sur \fB/dev/cf0\fR de faire du
cafe. Le parametre \fInombre\fP specifie le nombre de tasses.
.SS Options
.TP
\fB-c\fP
2 La page de manuel est re-formatee par la commande man a son appel.
4.3. REALISER L'AIDE DE GROFF
DES PAGES DE MANUEL A 111
caffe chaud
.TP
\fB-t \fItype\fR
specifie le type de caffe ou \fItype\fP peut etre \fBColombie\fP
.SH FICHIERS
.TP
\fC/dev/cf0\fR
Le periferique de controle de la machine (j'ai fait espray pour la fote)
.SH BOGUES
Connait pas les beugues moi, Mosieur !
La sequence .TH aecte le titre de la page de manuel, et .SH un debut de
section. La syntaxe :
coffee \- Controle la machine a cafe
doit ^etre respectee pour que la page de manuel puisse integrer la base de
donnees accessible par la commande man -k ou apropos3 .
Les sequences \fB, \fI et \fR permettent respectivement d'aÆcher le
texte en gras, en italique et de revenir a la police precedente. La sequence
.SS permet quand a elle de debuter une sous-section et la sequence .TP per-
met d'aÆcher les options en retrait.
COFFEE(1) COFFEE(1)
NOM
3 Ne pas oublier de lancer la commande makewhatis pour mettre a jour cette base de
donnees.
112 CHAPITRE 4. OUTILS
SYNOPSIS
coffee [ -c | -b ] [ -t type ] nombre
DESCRIPTION
coffee demande a la machine connectee sur /dev/cf0 de
faire du cafe. Le parametre nombre specifie le nombre de
tasses.
Options
-c caffe chaud
-t type
specifie le type de caffe ou type peut etre Colom
bie
FICHIERS
/dev/cf0
Le periferique de controle de la machine (j'ai fait
espray pour la fote)
VOIR AUSSI
lait(5), sucre(5), cognac(5)
BOGUES
Connait pas les beugues moi, Mosieur !
Il ne reste plus qu'a copier ce chier dans le repertoire contenant les pages
de manuel (en changant l'extension .man en .1) :
cp coffee.man /usr/man/man1/coffee.1
Pour installer la page de manuel dans un autre repertoire (par exemple
$HOME/man), il faut inclure ce repertoire dans la variable d'environnement
4.4. REALISER L'AIDE DE TEXINFO
DES PAGES D'INFO A 113
$MANPATH :
export MANPATH=$MANPATH:$HOME/man
Cette commande devra ^etre incluse dans un chier de demarrage (comme
le chier .bashrc, par exemple) pour qu'il soit tenu compte de cette modi-
cation a chaque session.
Il ne reste plus qu'a lancer la commande man :
man coffee
La page de manuel devrait alors s'aÆcher.
@ifinfo
Ce fichier ne documente rien (vide).
@end ifinfo
@menu
* Description :: Description du vide
* Appel :: Comment utiliser le vide
* Index :: Index de ce document
@end menu
A la suite de la commande @node est indique le noeud suivant, le precedent
et le parent (\(dir)" designe la page d'info generale de tout le systeme). Un
resume de ce chier est compris entre @ifinfo et @end ifinfo, et n'ap-
para^tra que dans la page Info (et pas dans le document formate par TEX).
@example
vide @var{options} @dots{}
@end example
Cet exemple appara^tra de la facon suivante pour un texte formate par
TEX :
vide options . . .
et comme ca pour une page Info :
vide OPTIONS ...
La suite du noeud Appel montre un tableau a deux colonnes (@table)
dont chaque option sera aÆchee de maniere speciale (@samp) :
@cindex Options
@cindex Arguments
Les options suivantes sont supportees :
@item -version
Affiche la version de @code{vide}.
@end table
Il reste ensuite a aÆcher l'index a cet endroit precis du document (@printindex cp) :
@node Index, , Appel, Top
@unnumbered Index
@printindex cp
et le document se termine par un court sommaire (@shortcontents), une
table des matieres (@contents) et le travail est ainsi termine (@bye) :
116 CHAPITRE 4. OUTILS
@shortcontents
@contents
@bye
La commande makeinfo realise la page Info et cree le chier indique
(vide.info, en l'occurence) :
makeinfo vide.texi
Avec Emacs, on peut taper M-x makeinfo-region et M-x makeinfo-buffer.
117
118 CHAPITRE 5. PROGRAMMATION DU SHELL
echo moi, $USER, faire sur $HOSTNAME mon premier script shell,
echo -n "aujoud'hui, le "
date
echo
5.3. PASSONS AUX CHOSES SERIEUSES 119
et l'appeller :
premier.sh
Un script shell peut en appeller un autre, le niveau du shell change alors
comme le montre l'exemple suivant (on parle alors de sous-shell) : le chier
s1.sh contient :
# Script s1.sh.
#
# Exemple d'appel de fichier script (s2.sh, ici) et
# illustration des sous-shells.
#
# Un script shell peut en apeller un autre, avec des parametres,
# y compris lui meme (script recursif).
#!/bin/sh
#--------------------#
# lire les arguments #
#--------------------#
#-------------------------#
# Redefinir les arguments #
#-------------------------#
a=1
b=2
c=3
d=4
e=5
set a b c d e
shift
echo
echo "Et maintenant, apres le passage de shift..."
set a b c d e
echo
echo "On refait un petit cout de set"
echo "Tous les arguments : $* ($# arguments)"
shift 3
echo
echo "Et maintenant, apres le passage de shift 3..."
#--------------#
# echo et read #
#--------------#
if [ $# = 0 ]
then
echo Aucun argument recu !
echo "$0 risque de ne pas bien marcher..."
echo
echo "Normalement il faut fournir de parametres avec ou sans tiret (-)"
fi
while [ -n "$1" ]
do
case $1 in
-*) echo "Option : $1" ;;
*) echo "Argument : $1 " ;;
esac
shift
done
on donnant satisfaction
De m^eme, pour rechercher la plus grande occurrence du critere de re-
cherche en debut de texte de la variable \t", on utilisera le signe \##" et
on entrera la commande :
echo ${t##T*i}
Le resultat est on. Pour rechercher en n de texte, on utilisera respecti-
vement \%" et \%%".
# Fichier varia.sh.
# Exemple d'utilisation de variables.
# Affectation, calculs...
variable1=5
echo variable1 $variable1
variable3=$[variable1+variable2]
# equivalent a la ligne :
# variable3=$((variable1+variable2))
declare -i nombre
nombre=3*9
echo 3*9=$nombre
let entiere=nombre/5
echo partie entiere de $nombre/5 : $entiere
nom="mathieu"
somme=10
i=3
espace=$(du -s)
echo $espace
#------#
# eval #
#------#
a=Mathieu
echo "a=Mathieu"
b=a
echo "b=a"
echo "\$b contient $b"
126 CHAPITRE 5. PROGRAMMATION DU SHELL
a='$b'
b='$c'
c=fin
echo "a='\$b'"
echo "b='\$c'"
echo "c=fin"
if [ $# = 0 ]
then
echo Aucun argument recu !
echo "$0 risque de ne pas bien marcher..."
echo
echo "Normalement il faut fournir en premier argument un nom"
echo "de fichier, comme test.sh, par exemple, soit le numero"
echo "d'un utilisateur comme indique dans le fichier /etc/passwd"
5.3. PASSONS AUX CHOSES SERIEUSES 127
#------#
# test #
#------#
# Fichiers...
# -f : fichier normal.
# -s : fichier non vide.
# -d : repertoire.
# -r : fichier accessible en lecture.
# -x : fichier accessible en ecriture.
# Variables...
# -z : variable vide.
# -n : variable non vide.
# -eq : egal.
# -ne : different.
# -lt : <.
# -ge : >.
# -le : <=.
# -ge : >=.
if test -f "$1"
# forme abregee : if [ -f "$1" ]
128 CHAPITRE 5. PROGRAMMATION DU SHELL
then
echo Le fichier \"$1\" est bien present.
echo "Nous allons maintenant lire ce fichier grace a la commande less"
echo 'Pour quitter less, taper "q"'
echo "Voulez vous lire le fichier $1 (o pour l'editer) ?"
read reponse
if [ $reponse = "o" ]
then
less "$1"
else
echo "Ok, pas d'edition du fichier..."
fi
else
echo "Fichier \"$1\" absent"
fi
fichier=$1
if [ $# = 0 ]
then
echo "Pas de fichiers donnes a $0"
else
test -e $1
echo "Le fichier $fichier est present si 0 est affiche : $?"
fi
if test \( -r $0 -a -x $0 \) -o \( -r $1 -a -x $1 \)
then
echo "$0 ou $1 : fichier lisible et ecrivable"
fi
vide=$1
test -s $vide || echo "$vide : fichier vide"
if [ $? = 0 ]
then
echo "La variable vide contient le fichier $vide"
fi
[ -d "../shell" ]
if [ $? = 0 ]
then
echo "le repertoire shell existe"
fi
L=25
l=7
if [ -z "$mathieu" ]
then
echo "la variable mathieu est vide"
fi
130 CHAPITRE 5. PROGRAMMATION DU SHELL
if [ -n "$L" ]
then
echo "la variable L est non vide"
fi
( [ -n "$l" ] && echo "la variable l est non vide" ) || echo "la variable
l est vide"
5.3.4 Utilisation de if
# Fichier if.sh.
# Exemple d'utilisation de if.
if [ $# = 0 ]
then
echo Aucun argument recu !
echo "$0 risque de ne pas bien marcher..."
echo
echo "Normalement il faut fournir le nom d'un fichier"
echo "Conseil : lancer \"$0 $0\"..."
echo
fi
if cp "$1" "$1%"
then
echo "sauvegarde de $1 reussie"
echo "nous allons maintenant l'editer grace a vi"
echo 'Pour quitter vi, taper "<Esc>:q!"'
echo "Voulez vous editer le fichier $1 (o pour le l'editer) ?"
5.3. PASSONS AUX CHOSES SERIEUSES 131
read reponse
if [ $reponse = "o" ]
then
vi "$1"
else
echo "Ok, pas d'edition du fichier..."
fi
else
echo "sauvegarde du fichier $1 impossible"
fi
if [ $# = 0 ]
then
echo Aucun argument recu !
echo "$0 risque de ne pas bien marcher..."
echo
echo "Le premier argument doit etre le nom d'un utilisateur"
echo "(root par defaut)..."
echo
fi
132 CHAPITRE 5. PROGRAMMATION DU SHELL
#------#
# case #
#------#
case $LOGNAME in
root) PS1="# ";;
mathieu | piou) PS1="Salut $LOGNAME$ ";;
*) PS1="\h:\w$";;
esac
export PS1
readonly PS1
echo $PS1
case $# in
0) echo "aucun parametre"
echo "Syntaxe : $0 <nom d'utilisateur>";;
1) echo "1 parametre passe au programme : $1";;
2) echo "2 parametres passes au programme : $1 et $2";;
*) echo "TROP DE PARAMETRES !"
esac
case $1 in
*[!0-9]*) echo "$1 n'est pas un nombre";;
esac
if [ $# -lt 1 ]
then
utilisateur="root"
echo "utilisateur : $utilisateur"
else
utilisateur=$1
echo "utilisateur : $utilisateur"
fi
case $? in
0) echo Message envoye a $utilisateur
mail $utilisateur << Fin
Et voici $LOGNAME egalement !!
Fin
;;
1) echo $utilisateur non connecte;;
2) echo "ERREUR appel errone de la commande grep";;
esac
134 CHAPITRE 5. PROGRAMMATION DU SHELL
if [ $# = 0 ]
then
echo Aucun argument recu !
echo "$0 risque de ne pas bien marcher..."
echo
echo "Il faut fournir le nom d'un fichier"
echo "Conseil : commencer par \"$0 $0\"..."
echo
fi
somme=0
for i in 1 2 3 4 5 6 7 8 9 10
do
somme=`expr $somme + $i`
done
# for sur tous les fichiers se terminant par "sh" (scripts shell).
# cp $fichier $fichier%
5.3. PASSONS AUX CHOSES SERIEUSES 135
done
echo
echo
if [ $# = 0 ]
136 CHAPITRE 5. PROGRAMMATION DU SHELL
then
echo Aucun argument recu !
echo "Tant mieux, mais essayez a nouveau le script avec comme"
echo "argument un nom d'utilisateur (si possible logue, comme"
echo "le votre)..."
echo
fi
nom=$1
if [ $# = 0 ]
then
set *.sh
fi
if [ "$1" = "$nom" ]
5.3. PASSONS AUX CHOSES SERIEUSES 137
then
echo "L'utilisateur \"$nom\" est connecte sur $2 depuis le $4 $3 a $5"
else
echo "L'utilisateur \"$nom\" n'est pas connecte"
fi
set `grep "^$nom" /etc/passwd | cut -d: -f1,3,4,6 | tr ":" " "`
if [ "$1" = "$nom" ]
then
echo "L'utilisateur \"$nom\" a un UID = $2 et un GID = $3"
echo "son repertoire personnel est $4"
else
echo "L'utilisateur \"$nom\" est inconnu"
fi
#-----#
# set #
#-----#
bizard=xzorglub
echo "bizard=xzorglub"
set -x
set +x
echo $contenu
# set -u
echo $contenu
contenu="-salut"
echo $contenu
set - $contenu
echo "Option \$1 : $1"
moi() {
echo Aujourd\'hui nous sommes le `date`.
echo Bienvenu sur $1.
}
if [ $# = 0 ]
then
echo Aucun argument recu !
echo "$0 risque de ne pas bien marcher..."
echo
fi
#--------#
# select #
#--------#
140 CHAPITRE 5. PROGRAMMATION DU SHELL
if [ -n "$nom" ]
then
echo
echo "$nom a ete choisit"
echo
# Affichage du prompt.
select argument
do
echo
echo "Argument selectionne : $argument "
echo
break
else
echo "Pas d'arguments passes au programme $0..."
fi
done
trap '' 2 3
trap 2 3
# Fichier lc.tcl.
# Un exemple tres simple d'utilisation de Tcl.
if {$argc != 1} {
error "lc <fichier>"
}
143
144 CHAPITRE 6. PROGRAMMATION EN TCL/TK
# Fichier simple.tcl.
# Exemple de programmation en Tcl.
puts ""
puts "Salut a \
tout le monde !"
# else doit se trouver sur la meme ligne que l'accolade fermant le if.
# L'espace entre if/else et '{' est primordial !
set pi 3.1416
if {$pi==3.1416} {puts "pi=$pi"} else {puts "pi <> 3.1416"}
6.1. PROGRAMMATION AVEC TCL 145
puts ""
puts "entrer un chiffre 0<chiffre<10 :"
set chiffre [gets stdin]
if {$chiffre >=7} {
puts "chiffre >=7"
} elseif {$chiffre >=4 && $chiffre < 7} {
puts "4<=chiffre<7"
} elseif {$chiffre >=2 && $chiffre<4} {
puts "2<=chiffre<4"
} else {
puts "chiffre <1 ou chiffre >10"
}
puts ""
puts "Appuyer sur une touche pour continuer..."
puts ""
gets stdin
set i 0
set somme 0
while {1} {
incr i ;# i++
if {$i==5} {continue}; # sauter si i=5
if {$i>10} {break}; # fin de la boucle i
set somme [expr $somme+$i];
puts $i
}
puts "Somme=$somme"
puts ""
puts "Appuyer sur une touche pour continuer..."
puts ""
gets stdin
146 CHAPITRE 6. PROGRAMMATION EN TCL/TK
set somme 0
foreach i { 1 2 8 9 10 } {
set somme [expr $somme+$i]
puts $i
}
puts "Somme $somme"
puts ""
puts "Appuyer sur une touche pour continuer..."
puts ""
gets stdin
puts "$prompt"
puts "*******************************************"
puts " Entrer une ligne commencant par q, s ou d "
puts "*******************************************"
puts ""
puts "$prompt"
# Utilisation de tablaux.
# Le tableau partition contient le nom des partitions.
# Le tableau disque_utilise contient la taille de la partition.
foreach n {1 4 5 6} {
puts "Disque utilise par $partition($n) = $disque_utilise($partition($n))M"
}
puts ""
puts "Facon 2 : par packets de 20 octets."
puts "----------------------------------------------------------"
puts ""
puts "Appuyer sur une touche pour continuer..."
puts ""
gets stdin
puts ""
puts "Facon 3 : par caractere (\"\\n\", fin de ligne ici)."
puts "----------------------------------------------------------"
puts ""
puts "Appuyer sur une touche pour continuer..."
puts ""
gets stdin
puts ""
exec ls
puts ""
puts "Appuyer sur une touche pour continuer..."
puts ""
gets stdin
puts ""
set x {1 2 3 4 5 6}
set y [join $x ""]
puts $y
6.2. PROGRAMMATION AVEC TK 153
# Fichier tksalut.
# Affiche le salut et permet de quitter a l'aide d'un boutton.
Dans l'exemple qui suit, on peut m^eme saisir un texte et executer une
commande :
#!/usr/X11R6/bin/wish -f
# Fichier tkedit.
154 CHAPITRE 6. PROGRAMMATION EN TCL/TK
bind .e <Return> {
exec xterm -e vi $fname
}
Le script qui suit montre quelque \celles", comment placer les widgets,
gerer les evenements souris ou clavier. . .La plupart des commandes devraient
avoir leur place dans un script Tk digne de ce nom. . .
#!/usr/X11R6/bin/wish -f
6.2. PROGRAMMATION AVEC TK 155
# Fichier tkmin.
# Le minimum que devrait contenir un script digne de ce nom.
wm geometry . 600x400
frame .f
text .text
# L'exemple qui suit peut servir pour afficher une aide interactive.
bind .f.b <Enter> {place .bh -in .f.b -relx 0.5 -rely 1.0}
bind .text <ButtonPress-1> {puts "pointeur en (%x, %y) sur le widget %W"}
bind .text <ButtonRelease-1> {puts "plus pointeur en (%x, %y) sur le widget
%W"}
button .f.q -text Quitter -command {exit} -fg blue -bg yellow
pack .f -fill x
Le script qui suit montre un exemple concret et utile : dessiner des ronds
et des rectangles, en utilisant des menus et la souris.
#!/usr/X11R6/bin/wish -f
# Fichier tkdraw.
# Un script qui dessine.
set oval_count 0
set rect_count 0
set orig_x 0
set orig_y 0
proc set_oval {} {
# Pour que Tcl ne croies pas que ces variables soient locales.
bind .c <ButtonPress-1> {
set orig_x %x
set orig_y %y
set oval_count [expr $oval_count + 1]
bind .c <B1-Motion> {
.c delete "oval$oval_count"
.c create oval $orig_x $orig_y %x %y -tags "oval$oval_count" -fill red
}
}
# Fin de la fonction set_oval.
proc set_rect {} {
6.2. PROGRAMMATION AVEC TK 159
bind .c <ButtonPress-1> {
set orig_x %x
set orig_y %y
bind .c <B1-Motion> {
.c delete "rect$rect_count"
.c create rectangle $orig_x $orig_y %x %y -tags "rect$rect_count" -fill
blue
}
}
# Fin de la fonction set_rect.
menu .mbar.file.menu
.mbar.file.menu add command -label "Quitter" -command { exit }
menu .mbar.obj.menu
canvas .c
pack .c -side top
.mbar.obj.menu invoke 1
Voila, une fois de plus en quelque ligne on a cree un super programme
avec une non moins superbe interface graphique (gure 6.2). . .
La plupart des commandes citees on une page de manuel tres detaillee
avec toutes les options disponibles, bien plus que celles presentees ici. . .
6.2. PROGRAMMATION AVEC TK 161
sont toutes equivalentes. Cette polyvalence peut ^etre genante, mais c'est
a l'utilisateur de choisir la forme qui lui pla^t.
Le script qui suit montre comment utiliser des variables, des tablaux,
comment eectuer des operations sur les variables, qu'elles soient des chires
ou des cha^nes de caracteres. . .
Noter que le chemin indique au debut du script peut aussi etre /usr/local/bin/perl
sur certains systemes. Pour s'en assurer, la commande which perl donnera
le bon chemin.
#!/usr/bin/perl
163
164 CHAPITRE 7. PROGRAMMATION EN PERL
print "\n";
#-----------#
# variables #
#-----------#
# Scalaires.
$age=22;
$dents=28;
$total=$age+$dents;
$utilisateur="Mathieu";
undef $nom;
#$nom="moi";
if (!(defined $nom)) {
print "variable nom non dfinie !\n" ;
}
# Matricielles.
@experience=(2, 5, 3);
@languages=("Perl", "Tcl/Tk", "Bash");
$nombre=@languages;
# Matricielles associatives.
foreach $i (1, 4, 5, 6) {
print "partition $i point de montage $def_partitions{$i}\n";
}
print "\n";
print "\n";
print "Appuyer sur une touche pour continuer...\n";
<STDIN>;
#print "PATH=$ENV{PATH}\n";
print "\n";
$premier=shift @languages;
166 CHAPITRE 7. PROGRAMMATION EN PERL
$second=shift @languages;
print "second argument de \@languages : $second\n";
#------------#
# operateurs #
#------------#
# Pour les chaines de caracteres, les operateurs (==, !=, <, >, <=, >=)
# sont remplaces par (eq, ne, lt, gt, le, ge).
$x=2;
$y=3;
$z=$x**$y;
# "()" initialise a 0.
$chaine1="Salut";
$chaine2=" le monde";
$message=$chaine1.$chaine2;
print "$message\n";
$marqueur="*";
$marqueur x= 14;
# Affiche 14 '*'.
print "$marqueur\n";
@chiffres=(1..9);
@alphabet=("a".."z");
print "@chiffres\n";
print "@alphabet\n";
print "\n";
$user="mathieu";
#$user="root";
if ($user eq "root") {
print "root c'est sympa...mais dangereux !\n";
}
else {
print "Desole $user, vous devez etre \"root\" !\n";
}
Le script qui suit montre comment utiliser les boucles, les ecritures ou
lectures dans un chier, les appels systemes, les expressions rationnelles. . .
#!/usr/bin/perl
print "\n";
168 CHAPITRE 7. PROGRAMMATION EN PERL
#----------------------------#
# if...else...elsif...unless #
#----------------------------#
# Lecture clavier.
$chiffre=<STDIN>;
chop $chiffre;
if ($chiffre >=7) {
print "chiffre >=7\n";
}
elsif ($chiffre >=4 && $chiffre < 7) {
print "4<=chiffre<7\n";
}
elsif ($chiffre >=2 && $chiffre<4) {
print "2<=chiffre<4\n";
}
else {
print "chiffre <1 ou chiffre >10\n";
}
#-------------------#
# while for foreach #
#-------------------#
169
# Facon 1.
# "@chiffres" est un tableau.
@chiffres=(1..9);
while (@chiffres) {
$i=shift @chiffres;
print "$i\n";
}
# Facon 2.
$somme=0;
$i=0;
# Facon 3.
# Facon 4.
$somme=0;
$i=0;
$somme=0;
$i=0;
#----------------#
# appels systeme #
#----------------#
while (<STDIN>) {
chop;
print $prompt;
}
while (<STDIN>) {
chop;
if ($_ eq "exit") {last;}
$statut=fork;
if ($statut) {
171
print "\n";
while(<fichier>) {
close fichier;
close sortie;
print "\n";
# Exemple de fonction.
# Les arguments passes a la fonction sont stoques dans la matrice "@_".
sub hello {
local($premier, $dernier)=@_;
print "Bonjour, $premier, $dernier\n";
}
$a=$ENV{USER};
$b=root;
&hello($a,$b);
require 'salut.pl';
&salut($a,$b);
print "\n";
#-------------------------#
173
# expressions rationelles #
#-------------------------#
while (<STDIN>) {
print "le texte suivant doit comporter 3 espaces au debut
(quit pour sortir)\n";
if ($_ =~ /^{3}\s/) {print "3 espaces au debut...\n\n"}
if ($_ !~ /\)\n/) {print "ne se termine pas par ')'...\n\n"}
if ($_ =~ "quit") {exit}
}
sub salut {
local($premier, $dernier)=@_;
print "Salut, $premier, $dernier\n";
}
1; # valeur de retour.
Voici le script :
#!/usr/bin/perl
# Syntaxe : ls -l | taille.pl.
# @champs est le tableau dans lequel les elements sont ranges (la
# numerotation commence a 0).
while (<STDIN>) {
@champs = split(/\s+/, $_);
$taille = $champs[4];
$nomfichier = $champs[8];
printf " \"%s\" a une taille de %d octets\n", $nomfichier, $taille;
}
Le resultat pourrait ressembler a ca :
"entree" a une taille de 187 octets
"essai.pl" a une taille de 869 octets
"logintime" a une taille de 1221 octets
"salut.pl" a une taille de 320 octets
"simple.perl" a une taille de 4137 octets
"sortie" a une taille de 0 octets
"taille.pl" a une taille de 634 octets
"var.perl" a une taille de 3212 octets
#!/usr/bin/perl
# $name commence par Mathieu ("^"), en maj. ou min. ("i") avec un espace
# apres Mathieu ("\b").
$name=<STDIN>;
if ($name =~ /^Mathieu\b/i) {
print "Bonjour, Mathieu\n";
} else {
print "desole...\n";
}
# Enleve ("s") tout apres (".*") un char different d'une lettre, d'un
# chiffre ou d'un chararactere souligne ("\W").
$name=~s/\W.*//;
# Transcrit en minuscules.
$name=~tr/A-Z/a-z/;
print "$name\n";
if (-M liste<7) {
while ($name=<liste>) {
chop ($name);
print "$filename -> $name\n";
177
}
}
close(liste);
}
@pass=getpwuid($<);
foreach $i (0..8) {
print "i=$i, $pass[$i]\n";
}
Le script qui suit montre comment reformater de facon soignee la sortie
d'une commande comme last, qui indique pour chaque login le nom de
l'utilisateur et le temps passe. Le script logintime aditionne le temps passe
dans chacune de ces sessions et aÆche le resultat sous forme d'un tableau.
#!/usr/bin/perl
# Fichier logintime.
# Ce script reformate la sortie de la commande last.
while (<STDIN>)
{
if (/^(\S*)\s*.*\((.*):(.*)\)$/)
{ $heures{$1}+= $2;
$minutes{$1} += $3;
$logins{$1}++;
}
}
{
$heures{$user} += int($minutes{$user} / 60);
$minutes{$user} %= 60;
write;
format STDOUT_TOP =
Utilisateur Temps total Nombre de sessions
------------- ------------- --------------------
.
format STDOUT =
@<<<<<<<<<<<< @<<<<<<<<<<<< @#######
$user, $letemps, $logins{$user}
.
}
Ainsi, le resultat pourrait ressembler a ceci :
Utilisateur Temps total Nombre de sessions
179
Une fois de plus, de facon tres simple on a reussit a eectuer une t^ache
qui aurait pu ^etre compliquee a realiser dans un autre langage.
180 CHAPITRE 7. PROGRAMMATION EN PERL
Chapitre 8
Programmation en C
#include <stdio.h>
#include <string.h>
181
182 CHAPITRE 8. PROGRAMMATION EN C
argv[0]);
printf ("\n");
printf ("*********************************\n");
printf ("Usage : %s <arguments>\n", argv[0]);
printf ("**********************************\n");
exit (1);
}
printf ("*********************************************\n");
printf ("Bonjour celui qui lira a \n");
printf ("**********************************************\n");
int
min (int a, int b)
{
if (a < b)
return a;
else
return b;
}
Pour compiler ce programme, il suÆt d'entrer :
gcc -o salou salou.c
L'executable sera salou, comme precise juste apres l'option -o.
#include <math.h>
double
aire_du_cercle (double r)
184 CHAPITRE 8. PROGRAMMATION EN C
{
return M_PI * SQUARE (r);
}
/*
* aire.c - Exemple de fichier source en C qui, compile avec
* un autre source (cercle.c), donne l'executable aire
*
*/
#include <stdio.h>
#include <stdlib.h>
/*
* fonction "aire_du_cercle" definie dans un autre fichier source
* (ici cercle.c).
*
*/
void
main (int argc, char **argv)
{
double aire, rayon;
if (argc < 2)
{
printf ("Usage : %s rayon\n", argv[0]);
exit (1);
}
else
{
rayon = atof (argv[1]);
aire = aire_du_cercle (rayon);
printf ("Aire du cercle de rayon %f = %f\n", rayon, aire);
}
}
8.2. CREER
DES BIBLIOTHEQUES C 185
#include <stdio.h>
#include <string.h>
#include <libmat.h>
#include <stdlib.h>
printf ("*********************************************\n");
printf ("bonjour celui qui lira a\n");
printf ("**********************************************\n");
int
min (int a, int b)
{
if (a < b)
return a;
else
return b;
8.2. CREER
DES BIBLIOTHEQUES C 187
}
Ce qui suit traite des bibliotheques statiques, qui sont directement in-
clues dans le chier binaire (executable) une fois la compilation faite. Ces bi-
bliotheques ont une extension .a et se trouvent generalement dans le repertoire
/usr/lib/. Pour la programmation en C, les plus utiles sont libc.a (bi-
bliotheque C standard) et libm.a ( bibliotheque mathematique).
#include <stdio.h>
#include <string.h>
#include <libmat.h>
#include <stdlib.h>
printf ("*********************************************\n");
printf ("bonjour celui qui lira a\n");
printf ("**********************************************\n");
}
printf ("\n"); /* for i */
}
int
min (int a, int b)
{
if (a < b)
return a;
else
return b;
}
Pour compiler un tel programme, il faut entrer les commandes suivantes :
gcc -c -I ../include salaire.c
gcc -c cercle.c
gcc -L ../lib salaire.o cercle.o -o salaire -lmat
C'est un peu complique, et surtout long a taper, d'autant qu'on peut
compiler des chiers qui n'ont pas ete modies (si seul le chier cercle.c
est modie, ce n'est pas la peine de re-compiler le chier salaire.c). Les
makeles vont nous aider pour nous simplier la vie.
void
main (void)
{
cout << "Salut en C++ !" << endl;
}
Pour compiler un tel chier, taper (la syntaxe est semblable a celle utilisee
par gcc) :
g++ salut++.C -o salut++
8.4. LES MAKEFILES 191
class string
{
char *p;
int longueur;
public:
string(int l) { p = new char[longueur = l]; }
~string(void) { delete[] p; }
string& operator=(string&);
};
string& string::operator=(string& s)
{
p = s.p;
longueur = s.longueur;
}
void main(void)
{
string s1(10);
string s2(20);
cout << "Tout s'est bien passe !" << endl;
s1 = s2;
}
CC = gcc
CFLAGS = -ansi
LDFLAGS = -lm -lc # bibliotheque math suivie de bibliotheque C
all : salou
Si on se contente de specier quel compilateur C il faut utiliser, et avec
quelles options, la cible (le chier salou qu'on cherche a construire) sera faite
en compilant le chier salou.c (evident puisqu'on compile avec le compila-
teur C, CC). Si le chier salou existe deja et qu'aucune modication n'a ete
apportee au chier source, la compilation n'aura pas lieu. On aurait aussi pu
mettre :
salou : salou.c
gcc -ansi -lm -lc -o salou salou.c
La ligne de dependances salou : salou.c indique clairement que le -
chier salou a besoin du chier salou.c pour ^etre construit et que si celui-ci
n'a pas ete modie, la compilation du chier salou n'aura pas lieu. Si le
chier salou.c n'existe pas mais qu'il y a dans la suite du makele une ligne
indiquant comment le construire, le chier salou.c sera construit puis le -
chier salou sera a son tour construit. Noter qu'il faut une tabulation a la suite
de la ligne de dependances (la ligne gcc -ansi -lm -lc -o salou salou.c
dans l'exemple precedent).
Voici un exemple plus explicite :
# Exemple simple d'utilisation d'un Makefile
#
# Par defaut, le Makefile sait comment construire un fichier objet (*.o)
# a partir d'un fichier source (*.c) :
#
# aire.o : Makefile aire.c
#
# suffit a lancer la compilation a partir du fichier source (ici aire.c)
#
#
# La commande CC sera invoquee par defaut, c'est l'ancien compilateur C;
# c'est sur la plupart des systemes un lien vers le nouveau compilateur
# GNU gcc :
#
# aire : $(OBJS)
8.4. LES MAKEFILES 193
#
# suffit a lancer la compilation a partir des fichiers objets
#
#
# ANSI_FLAG peut etre definit lorsque on lance la commande make :
#
# make ANSI_FLAG=Ok
#
#
# ANSI_FLAG peut aussi etre definit dans le fichier .bashrc :
#
# export ANSI_FLAG = Ok
#
#
# ATTENTION ! ANSI_FLAG = non est aussi une definition, si bien que le
# programme sera egalement compile avec la norme ansi...
#
ANSI_FLAG =
# aucune definition, accepte
CFLAGS=-g -O
# options de compilation
PROG = ../../
# chemin du repertoire prog
BIN = $(PROG)bin/
# chemin du repertoire bin
ifdef ANSI_FLAG
CFLAGS := $(CFLAGS) -ansi # faut il compiler suivant la norme ansi ?
endif
194 CHAPITRE 8. PROGRAMMATION EN C
install : all
mv aire $(BIN)
all : aire
aire : $(OBJS)
# Nettoyage des fichiers objets (si on considere par exemple que le fichier
binaire n'a dorenavent plus besoin d'etre recompile)
clean :
rm -f `find . -name '*.o' -print`
aire : $(OBJS)
$(CC) -o $@ $(OBJS)
%.o : %.c
$(CC) $(CFLAGS) $(CPPFLAGS) -c -o $@ $<
Et voici un exemple un peu plus complique (ce makele permet de compi-
ler deux versions du programme aire au choix : aire, le programme normal,
et aire_dbg avec l'option -g pour deboguage) :
# Exemple d'utilisation de regles implicites : les regles de modele
aire : $(OBJS)
$(CC) -o $@ $(OBJS)
aire_dbg : $(DEBUG_OBJS)
196 CHAPITRE 8. PROGRAMMATION EN C
$(CC) -o $@ $(DEBUG_OBJS)
%.o : %.c
$(CC) $(CFLAGS) $(CPPFLAGS) -c -o $@ $<
%_dbg.o : %.c
$(CC) -c -g -O -o $@ $<
clean :
rm -f `find . -name '*.o' -print`
# $(CC) est connu, il correspond a la commande cc qui est un lien vers gcc
aire : $(OBJS)
$(CC) -o $@ $(OBJS)
.c .o :
$(CC) $(CFLAGS) $(CPPFLAGS) -c -o $@ $<
INC_FILE = cache
include $(INC_FILE)
et le chier cache contient :
cache_rm :
@rmdir $$HOST_NAME
{
char *name;
int version;
} OBJDATA;
void main(void)
{
void *dlobj;
void * (*init_appel)(char *name);
void (*show_appel)(void *data);
void (*destroy_appel)(char *data);
if(dlobj=dlopen("libdobj.so.1", RTLD_LAZY))
{
void *data;
init_appel=dlsym(dlobj,"init");
show_appel=dlsym(dlobj,"montre");
destroy_appel=dlsym(dlobj,"detruit");
data=(*init_appel)("Test Objets");
(*show_appel)(data);
(*destroy_appel)(data);
}
}
Il faut ensuite compiler ce programme :
gcc -o dltest dltest.c -ldl
Il ne reste plus qu'a tester le programme :
dltest
^
8.6. RCS, CONTROLE DE VERSIONS DE CODE SOURCE 201
{ $State$
Ces informations sont egalement accessibles par la commande ident :
ident salut.c
main ()
{
char *entree = NULL;
lit_entree (entree);
printf ("Vous avez tape : %s\n", entree);
}
void
lit_entree (char *s)
{
8.7. OUTILS POUR LA PROGRAMMATION EN C 203
list bogue.c:11
6
7 main ()
8 {
9 char *entree = NULL;
10
11 lit_entree (entree);
12 printf ("Vous avez tape : %s\n", entree);
13 }
14
15 void
(gdb)
C'est clair, le probleme vient de cette chue ligne 11, puisque le pointeur
entree n'est pas initialise. On peut corriger le programme en aectant le
pointeur entree a buf qui lui est initialise. Pour cela, taper :
file bogue
Il appara^t alors :
A program is being debugged already. Kill it? (y or n) y
break 10
On voit alors s'aÆcher sur l'ecran :
Breakpoint 1 at 0x80484bd: file bogue.c, line 10.
(gdb)
On peut donc lancer le programme par la commande run, qui s'execute
jusqu'a la ligne 10 :
Starting program: /home/mathieu/prog/C/gdb/bogue
On peut par ailleurs utiliser bien d'autre commandes sous gdb, comme
next pour executer la ligne de code suivante (apres un point d'arr^et, par
exemple) dans la m^eme fonction (il faut bien-s^ur que le programme tourne,
c'est-a-dire que run ait ete lance), ou step pour executer la ligne de code
suivante et eventuellement les appels de fonctions rencontres. On peut aussi
executer le programme jusqu'a une ligne donnee, par exemple until 24
execute le programme jusqu'a la ligne 24. La commande print permet de
conna^tre la valeur d'une variable : print a donne :
$1 = 8
et print b donne :
$2 = 5
206 CHAPITRE 8. PROGRAMMATION EN C
L'expression obeit aux m^emes regles que celles des points d'arr^et condi-
tionnels.
8.7. OUTILS POUR LA PROGRAMMATION EN C 209
int
main ()
{
char *lamemoire, ch;
Souvent un chier evoque n'aura pas le m^eme nom sur le systeme. Cela
depend des distributions, mais on peut facilement retrouver ce chier gr^ace
a la commande locate. Par exemple pour le chier de conguration de
LILO (chargeur de Linux), il existe divers noms comme /etc/lilo.conf ou
/etc/lilo/config ou encore /boot/lilo.conf. Pour trouver un tel chier,
on peut par exemple entrer la commande suivante :
locate lilo | grep conf
213
214
CHAPITRE 9. ADMINISTRATION SYSTEME
Pour les options -size, -atime, -mtime, -ctime et -links, il faut specier
une valeur, precedee par le signe \+" pour \superieur a", \-" pour \inferieur
a", ou rien pour \egal a". Par exemple :
find . -mtime -3 -print
aÆche les chiers dont les dernieres modications remontent a moins
de 3 jours (donc tous les chiers modies entre aujourd'hui et il y a trois
jours seront aÆches). De m^eme, +5 aÆcherait les chiers dont les dernieres
modications remontent a plus de 5 jours.
Voici d'autres exemples d'utilisation de la commande find :
{ Pour aÆcher tous les chiers se terminant par \.c" :
find . -name ".c" -print
{ Pour aÆcher tous les repertoires dont le nom se termine par \s" :
find . -type d -name "*s" -print
Pour aÆcher tous les chiers, on aurait utilise le code f.
{ Pour aÆcher tous les chiers ayant une certaine permission exprimee
en octale (voir section 1.9.6 page 24) :
find . -perm 755 -print
ou ayant au minimum les droits d'ecriture pour le groupe :
find . -perm -020 -print
{ Pour executer la commande ls -l pour chaque chier trouve :
find . -type f -exec ls -l {} \;
et pour demander conrmation avant chaque action :
find . -type f -ok -exec rm {} \;
Toute autre commande peut ^etre executee avec l'option -exec.
1 Un bloc est forme de 512 caracteres.
216
CHAPITRE 9. ADMINISTRATION SYSTEME
{ Pour associer plusieurs criteres avec -a pour et, -o pour ou, ! pour
negation. Par exemple :
find . ! -user root -print
aÆche tous les chiers n'appartenant a root, et
find . \( -name '*.tex' -o -name '*.dvi' \) -print
aÆche tous les chiers se terminant par \.tex" ou \.dvi".
gzip -l salut.c.gz
Si aucun chier n'est precise, gzip tente de compacter les donnees en
provenance de l'entree standard :
ls -laR $HOME | gzip > list.gz
cree une liste de tous les chiers du repertoire personnel, puis la sauvegarde
dans le chier compresse liste.gz.
L'option -c permet d'ecrire le resultat sur la sortie standard :
gunzip -c liste.gz | less
gunzip -c est l'equivalente de la commande zcat sur la plupart des
systemes.
9.3.2 tar
tar permet de rassembler plusieurs chiers en un seul :
tar cvf prog.tar prog/
On peut mettre plusieurs v pour avoir plus d'informations :
tar cvvf prog.tar prog/
Pour avoir des informations sur l'archive :
tar tvf prog.tar
Pour extraire les chiers, se placer a l'endroit desire et lancer :
tar xvf prog.tar
On peut n'extraire qu'un seul chier de l'archive :
tar xvf prog.tar prog/C/salut.c
Pour combiner tar et gzip, on peut faire de deux facons :
218
CHAPITRE 9. ADMINISTRATION SYSTEME
Comme alias pour resumer ces commandes, on peut par exemple denir
(dans le chier .bashrc) :
tarc() {tar czvf $1.tar.gz $1}
tarx() {tar xzvf $1}
tart() {tar tzvf $1}
9.3.5 cpio
La commande cpio permet egalement de faire des sauvegardes. Voici
quelque exemples d'utilisation :
La commande find cherche tous les chiers non utilises depuis 7 jours
que cpio sauvegarde sur disquette (-o /dev/fd0) avec en-t^ete dans chaque
chier ASCII (-c), par blocs de 5 Ko (-B) (cf. find section 9.1 page 214) :
9.3. ARCHIVAGE DES DONNEES 221
9.3.6 dd
La commande dd permet egalement de faire des sauvegardes. Par exemple,
pour la copie de quelque blocs (count=) d'un chier (if=) vers un autre
chier (of=) :
dd if=/dev/fd0 of=/tmp/Disquette count=2
La commande od permet de lire le chier copie (/tmp/Disquette dans
l'exemple precedent).
L'option bs= permet de denir la taille des blocs en octets avec laquelle
les donnees seront lues, converties et reecrites (512 octets par defaut) :
222
CHAPITRE 9. ADMINISTRATION SYSTEME
dd if=/usr/src/linux-2.0.33.pre.SuSE.3/arch/i386/boot/zImage
of=/dev/fd0 bs=8192
Le tableau 9.6 resume les principales options de la commande dd.
Pour creer un compte \a la main", il suÆt de rajouter dans les chiers
/etc/passwd et, si besoin est, dans le chier /etc/group, une ligne comme
explique ci-dessus, et de creer le repertoire personnel :
mkdir /home/toto
cp /etc/skel/* /home/toto
chown toto /home/toto
chgrp le_groupe_de_toto /home/toto
Il ne reste plus qu'a attribuer un mot de passe en tapant passwd toto.
Voici la syntaxe du chier /etc/group :
9.6. PILOTES DE PERIPH
ERIQUES CHARGEABLES (MODULES) 225
Pour mettre hors service une zone de swap, il suÆt d'entrer la commande
swapoff suivie du nom du peripherique. Ainsi, la commande :
swapoff /swap
met hors service une zone de swap contenue dans un chier, et
swapoff /dev/hda2
met hors service une zone de swap contenue dans une partition. C'est
seulement apres qu'on peut eacer chier ou partition.
#------------------------------#
# Exemple de fichier lilo.conf #
#------------------------------#
#
# LILO est un gestionnaire d'amorcage qui est capable de demarrer
# n'importe quel systeme d'exploitation installe sur le disque dur
#
# lancer la commande /sbin/lilo pour installer LILO
#
#-------------------------------#
# Quelque parametres essentiels #
#-------------------------------#
#
# boot= : indique le nom du peripherique sur lequel LILO doit s'installer
# ici : /dev/hda (disque dur IDE). LILO sera installe dans cette partition
# en tant que chargeur primaire.
# pour installer LILO sur disquette par exemple, on pourrait mettre :
# boot=/dev/fd0
#
# compact permet d'effectuer quelque optimisations.
#
# map= : designe le fichier que LILO genere lorsqu'il est installe.
# Ce fichier sera absent jusqu'a la premiere installation de LILO.
#
# install= : designe le fichier contenant le code d'amorcage a
# recopier sur le secteur du disque dur.
#
# on pourait aussi ajouter une ligne comme
# delay=50
# qui indiquerait le temps d'attente au demarrage avant que LILO charge par
# defaut le premier systeme specifie, mais bon...
#
boot=/dev/hda
compact
map=/boot/map
install=/boot/boot.b
#
prompt
message="/etc/boot.msg"
#
#------------------------------------------------#
234
CHAPITRE 9. ADMINISTRATION SYSTEME
Appuyer sur la touche Tab pour aÆcher la liste des options d'amorcage
(les noms denits par la ligne label du chier /etc/lilo.conf).
FDISK /MBR
Les copies de sauvegarde du secteur d'amorcage original (avant installa-
tion de LILO) sont sauvegardees dans les chiers /boot/boot.0300 pour les
disques IDE et /boot/boot.0800 pour les disques SCSI. Pour remettre en
place l'ancien secteur de cette sauvegarde, il faut lancer :
dd if=/boot/boot.0300+ of=/dev/hda bs=446 count=1
Le code d'amorcage est contenu sur les 446 premiers octets, ce sont seule-
ment ceux-la qui sont copies (le reste contient la table des partitions, jusqu'a
512).
Attention ! Bien verier que ces chiers comprennent les secteurs d'amor-
cage desires (il existe parfois par defaut des versions inutilisables de ces -
chiers, il faut les supprimer avant d'installer LILO. . .).
#! /bin/sh
# Un peu de menage...
echo "Nettoyage de /tmp..."
find /tmp -atime 3 -exec rm -f {} \;
clock -s
240
CHAPITRE 9. ADMINISTRATION SYSTEME
ca::ctrlaltdel:/sbin/shutdown -r -t 4 now
Les commandes reboot, halt et fasthalt sont des racourcis vers shutdown
avec les options appropriees (respectivement -r now, -h now et -f now).
Pour re-installer LILO, taper make zlilo au lieu de make zImage. Pour
charger le nouveau noyau a partir d'une disquette, proceder comme suit (gar-
der tout de m^eme l'ancienne disquette de boot, au cas ou. . .).
Il faut d'abord s'assurer que le demon d'impression est bien lance (nor-
malement il l'est au demarage) :
ps -ax | grep lpd
Le resultat devrait ressembler a ca (si ce n'est pas le cas, il faut le lancer :
/usr/sbin/lpd) :
102 ? S 0:00 /usr/sbin/lpd
9.15. INSTALLER UNE NOUVELLE IMPRIMANTE 245
Il faut egalement s'assurer que le c^able est bien connecte au port (serie
ou parallelle) :
dmesg | grep lp
Le resultat devrait ressembler a ca (pour un port parallele) :
lp1 at 0x0378, (polling)
# cf. /var/lib/apsfilter
Le ltre utilise est un programme Tcl qui ecrit la date courante suivi par
l'entree standard dans le chier /tmp/simple.out :
#!/usr/bin/tclsh
/var/spool/lpd/simple/status
/var/log/lpd-errs
/sbin/pac
TmpDir=/tmp
TmpFile=$TmpDir/deskjet.$$
# Programmes
CAT=/bin/cat
DVIPS=/usr/TeX/bin/dvips
PGS=/usr/bin/gs
AIIPS=/usr/local/bin/a2ps
# C'est parti
$CAT - > $TmpFile
shift
FileType=$*
case $FileType in
*text*|*script*)
$CAT $TmpFile | $AIIPS -nP -r -8 | $GS
;;
*data*)
echo -ne '\033&;k0G' # C'est un et commercial sans ; !
/bin/cat $TmpFile
;;
*)
echo "Deskjet: Unknow filetype $FileType" >> /dev/console
echo "Deskjet: $TmpFile Unknow filetype $FileType" | mail $NOTIFY
;;
;;
*text*|*script*)
$CAT $TmpFile | $AIIPS -nP -r -8 | $GS
;;
*data*)
echo -ne '\033&;k0G' # C'est un et commercial sans ; !
/bin/cat $TmpFile
;;
*)
echo "Deskjet: Unknow filetype $FileType" >> /dev/console
echo "Deskjet: $TmpFile Unknow filetype $FileType" | mail $NOTIFY
;;
esac
/bin/rm -f $TmpFile
echo -ne '\033E'
Le ltre joint au paquet de gestion d'impression se nomme /usr/sbin/lpf.
Il est peu pratique, mais d'autres ltres sont s^urement disponibles sur le
systeme. Pour en avoir la liste, taper :
man -k filter
Pour specier un ltre, il faut modier la valeur de la variable if dans le
chier de conguration /etc/printcap, puis relancer lpd :
lpc restart all
Il existe deux ltres frequemment utilises car tres puissants :
{ le ltre nenscript assure entre autres la conversion de texte simple
vers le PostScript. Il est situe en general dans le repertoire /usr/bin.
Il imprime sur l'imprimante speciee par, dans l'ordre de preference :
{ la variable d'environnement $NENSCRIPT.
{ la variable d'environnement $PRINTER, si la precedente variable
d'environnement n'est pas initialisee.
{ l'imprimante choisie par defaut par lpr si aucune des deux prece-
dentes variables d'environnement n'est initialisee.
L'option -Z emp^eche la conversion si le chier ne commence pas par
\%!" (la plupart des chiers PostScript commencent par \%!"). Bien
que ce ltre ne soit pas able a 100%, nenscript devrait convenir dans
la plupart des cas. Les options a passer comme -Z par exemple pouront
9.15. INSTALLER UNE NOUVELLE IMPRIMANTE 253
Dans tous les cas, un ltre general comme presente plus haut pourra
invoquer ou non suivant les cas dierents ltres comme gs ou nenscript.
mkdir /var/spool/lpd
chmod 755 /var/spool/lpd
chmod +s /var/spool/lpd
chgrp lp/var/spool/lpd
touch .seq
chown root.lp .seq
8 Pour faciliter son identication, le nom du repertoire de spool doit ^etre le premier nom
reference dans l'entree du chier /etc/printcap.
9 On initialise aussi le sticky bit an de permettre a lp de prendre les droits de root.
9.15. INSTALLER UNE NOUVELLE IMPRIMANTE 255
lprm -
On peut egalement eacer tous les chiers de la le d'attente d'une im-
primante, speciee apres l'option -P :
lprm -Pada
ou d'un utilisateur :
lprm root
L'utilitaire lpc permet de gerer les les d'impression. Pour obtenir des
informations sur l'etat de l'ensemble des imprimantes et des utilisateurs,
taper lpc status :
lp:
queuing is enabled
printing is enabled
no entries
printer idle
simple:
queuing is enabled
printing is enabled
no entries
printer idle
ou, en cas d'impression en cours :
lp:
queuing is enabled
printing is enabled
1 entry in spool area
lp is ready and printing
simple:
queuing is enabled
printing is enabled
no entries
printer idle
et pour avoir des informations sur une imprimante particuliere, taper
lpc status simple, par exemple :
simple:
queuing is enabled
printing is enabled
no entries
printer idle
258
CHAPITRE 9. ADMINISTRATION SYSTEME
lorsque la queue sera reactivee. L'option down combine les actions des com-
mandes disable et stop. L'option up fait l'inverse (annule stop), et combine
les actions des commandes enable et start.
Bien entendu, il existe egalement les options status et restart deja evo-
quees, qui sont accessibles a n'importe quel utilisateur et qui permettent
respectivement d'avoir des informations sur l'etat de l'ensemble des impri-
mantes et de relancer le demon d'impression. Noter que les options stop et
down peuvent prendre en argument une notication a l'ensemble des utilisa-
teurs.
{ S'il n'y a pas beaucoup de place sur le disque, la copie des gros
chiers lors de l'impression peut poser probleme. On peut faire creer
un lien du repertoire de spool vers ce chier avec l'option -s :
9.15. INSTALLER UNE NOUVELLE IMPRIMANTE 261
Si un ltre est specie sur le systeme local, il ne sera pas pris en compte
par le systeme distant (le chier sera transfere sur le systeme distant,
et c'est le processus lpd du systeme distant qui se charge d'imprimer
le chier). Seuls les ltres species dans le chier /etc/printcap du
systeme distant seront pris en compte. On peut toutefois ltrer le chier
avant de l'envoyer en creant un script qui envoit la sortie a l'imprimante
distante :
#!/bin/sh
{
#
# Commandes qu'il y aurait dans le filtre...
#
} | lpr -Psimplet -h -l
{ Pour eviter l'eet d'escalier (le caractere saut de ligne LF en n de
ligne sous UNIX est remplace par le caractere retour chariot CR plus
saut de ligne LF), lorsqu'on imprime des chiers MS-DOS sous UNIX :
Premiere ligne
Seconde ligne
Troisieme ligne
Quatrieme ligne
il faut essayer de congurer l'imprimante (si possible), ou inserer un
ltre en entree du type suivant :
#!/bin/sh
cat
if [ "$1" = -l ]; then
cat
else
# Envoie le caractere nouvelle page a la fin du fichier (^M=CR)
sed -e s/$/^M
fi
et pour que les modications ne soient pas changees par les applications
(certaines veulent assigner les couleurs par defaut une fois leur t^ache ter-
minee) :
setterm -store
Pour faire en sorte que les modications du chier de conguration,
/etc/syslog.conf, soient prisent en compte, il faut que syslogd recoive
le signal -1, appele SIGHUP :
kill -HUP `cat < /etc/syslog.pid`
Le chier /etc/syslog.pid contient le numero de processus de syslogd.
Les chiers suivants sont rattaches a syslogd :
11 Cette commande n'est cependant pas destinee a ca au depart.
9.18. REPARATION
D'UN SYSTEME DE FICHIERS 265
$maxlines = 20;
@before = ();
$syntaxe = "Syntaxe: cgrep.pl terme_a_rechercher
fichier_a_parcourir\n";
push(@before, $_);
}
# Le tableau @before contient la bonne quantite d'elements, donc on
# passe maintenant dans une partie ou @before garde une taille
# constante
while (<F>)
{
if (/$terme/o)
{
print @before;
print $_;
& print_next_lines;
}
push(@before, $_);
shift(@before);
}
close(F);
exit 1;
sub print_next_lines
{
for ($i = 0; $i < $maxlines; $i++)
{
print scalar(<F>);
}
exit 0;
}
{ le super-block (qui contient les informations globales vitales) est en-
dommage, et le systeme de chier ne peut donc pas ^etre monte. Un
message d'erreur du type :
Couldn't find valid filesystem superblock.
s'aÆche alors. Pour le reparer, il faut d'abord avoir determine sur un
systeme \sain" (partition sans probleme de superblock) combien de
blocks contient un \groupe de block". Si /dev/hda2 est la partition
ab^mee, de type ext2 (voir section 9.8 page 226), entrer la commande
suivante :
/sbin/dumpe2fs /dev/hda2 | less
et relever la ligne indiquant le nombre de blocks par groupe de block :
9.19. EN CAS DE PROBLEME 269
loadkeys /usr/lib/kbd/keytables/fr.map
mount -w -n -o remount /
La suite est comme dans la solution precedente pour avoir un nouveau
mot de passe.
{ l'image d'une bibliotheque partagee n'est pas accessible. Nor-
malement, il existe un lien, comme /lib/libc.so.4, qui pointe vers le
chier /lib/libc.so.4.6.18, par exemple (le numeros indiquent les
versions). Il faut alors creer ce lien, s'il n'existe pas ou qu'il pointe vers
un mauvais chier :
cd /mnt/lib; ln -sf libc.so.4.6.18 libc.so.4
et appeler ldconfig. Pour plus d'informations, voir section 8.5 page 197.
271
272 CHAPITRE 10. AUTRES
drive c: file="/dev/hda1"
mtools_lower_case=1
10.3 Timezone
Timezone est un systeme qui permet de gerer le changement d'horaires
d'ete et d'hiver. La France se trouve dans une zone horaire MET (Medium
European Time, soit GMT + 1). La zone \MET DST" correspond a l'heure
d'ete active (GMT + 2). Le repertoire /usr/lib/zoneinfo contient les -
chiers binaires qui indiquent les regles de calcul de l'heure dans dierentes
zones du globe. Le chier time.doc contient plus de precisions que la presente
10.4. NOUVEAUX CHANGEMENTS D'HEURE 273
section.
Pour congurer la zone horaire, il faut copier le chier MET sous le nom de
/usr/lib/zoneinfo/localtime, puis faire un lien symbolique de ce chier
vers /usr/lib/zoneinfo/posixrules. Voici les commandes a passer :
cd /usr/lib/zoneinfo
cp MET localtime
ln -sf localtime posixrules
Utiliser ensuite la commande clock pour mettre le systeme a l'heure. Il
y a alors deux possibilites :
{ la machine est a l'heure GMT.
{ la machine est a l'heure locale.
La premiere solution est preferable, mais MS-DOS ne gere pas correcte-
ment cette approche. L'horloge sera donc faussee sur ce systeme. Par contre,
tous les changements d'heure, deux fois par an, seront pris en charge par
Linux. Dans ce cas, il faut rajouter dans le chier /etc/rc.d/rc.local la
commande suivante :
clock -u -s
Linux s'ajustera sur l'horloge sauvegardee. Si la CMOS est a l'heure lo-
cale, la commande dans le chier /etc/rc.d/rc.local devient clock -s,
et les changements d'heure ne seront automatiques que si la machine est al-
lumee au moment des changements d'heure. Il faudra manuellement reecrire
la nouvelle heure dans la CMOS par la commande clock -w, ou mettre l'hor-
loge a l'heure avec le setup. La commande date permet de verier la validite
de l'heure : elle renvoie heure et timezone et date -u donne toujours l'heure
en GMT : la commande date renverra :
Sat Jan 9 20:57:22 MET 1999
tandis que la commande date -u renverra :
Sat Jan 9 19:58:19 GMT 1999
En ete, MET DST (Daylight Savings Time) serait indique.
accton /var/log/acct
accttrim -n 2000 /var/log/acct 2> /dev/null
programme init qui est lance lors de l'amorage du systeme. Au debut du pro-
gramme init.c, il faut modier la denition de la constante SOME USER
pour qu'elle ait la valeur 2, recompiler init, et le re-installer. Cette premiere
solution peut toutefois s'averer ^etre insuÆsante car une personne peut tou-
jours booter sur un autre peripherique (en utilisant l'option root = MonLi-
nux). En utilisant LILO, pas de probleme ! Il suÆt alors d'ajouter les lignes
suivantes pour chacune des images dans le chier /etc/lilo.conf :
password = le_mot_de_passe_en_clair
restricted
11 = 8 + 2 + 1
277
278ANNEXE A. CONVERSION DES NOMBRES EN BASE DECIMALE
ET EN BASE HEXAD
11 = 1 23 + 0 22 + 1 21 + 1 20
11 = 1011
Bibliographie
[1] M. DECORE : article.dvi, 3 novembre 1999
[2] M. WELSH et L. KAUFMAN : Le systeme Linux, O'REILLY, 1997
[3] M. DECORE d'apres M. WELSH et L. KAUFMAN, Vide, 3 novembre
1999.
279
Index
.Xclients, 44 /lib/, 197
.Xdefaults, 84 /proc, 241
.Xresource, 84 /sbin/debugfs, 265
.bash prole, 46 /sbin/dumpe2fs, 268
.bashrc, 118 /sbin/e2fsck, 265
.inputrc, 276 /sbin/init, 237
.openwin-init, 79 /sbin/lilo, 235
.xinitrc, 44 /usr/X11R6/bin/XF86 SVGA, 31
/, 231 /usr/X11R6/bin/startx, 44
/boot/boot.0300, 235, 237 /usr/lib/, 197
/boot/boot.0800, 235, 237 /usr/lib/zoneinfo/localtime, 272, 273
/dev/console, 264 /usr/lib/zoneinfo/posixrules, 273
/dev/null, 21 /usr/sbin/lpd, 244
/etc/DIR COLORS, 263 /usr/sbin/lpf, 252
/etc/bashrc, 118 /usr/spool, 254
/etc/fstab, 226, 230 /usr/spool/lpd/, 247
/etc/group, 224 /usr/src/linux, 241
/etc/inittab, 237, 240 /var/adm/wtmp, 265
/etc/ld.so.conf, 197 /var/log/lastlog, 265
/etc/lilo.conf, 232, 274 /var/run/utmp, 265
/etc/mtools.conf, 271 /var/spool, 254
/etc/passwd, 224 /var/spool/lpd, 254
/etc/printcap, 245 /vmlinuz, 231
/etc/prole, 118 $EDITOR, 222
/etc/rc.d/rc, 238 $GS DEVICE, 250
/etc/rc.d/rc.local, 238 $HOME/.Xdefaults, 60
/etc/rc.d/rc.sysinit, 230 $HOME/.bash login, 118
/etc/rc.d/rcN.d, 238 $HOME/.bash prole, 118
/etc/rc.local, 238 $HOME/.fvwmrc, 64
/etc/shadow, 224 $HOME/.mwmrc, 82
/etc/shells, 117 $HOME/.openwin-menu, 80
/etc/syslog.conf, 264 $HOME/.prole, 118
/etc/syslog.pid, 264 $HOME/.twmrc, 55
280
INDEX 281
combine, 96 fg, 21
Console externe, 237 fgrep, 15
convert, 93 chiers bitmap, 85
Convertir les chiers Dos en chiers chiers pixmap, 89
Linux, 19 le d'attente d'impression, 247
core (examen d'un chier), 209 Filtres d'impression, 246, 249
cp, 27 APSlter, 253
cpio, 220 Ghostscript, 249
Creation d'une zone de swap, 230 nenscript, 252
cron, 223 PostScript, 249
crontab, 222 nd, 214, 219, 221, 223
curseur, 50 nger, 265
cut, 17 fonts.alias, 52
fonts.dir, 52
Demarrer Linux avec LILO, 232 free, 230
developpement (outils), 210 fvwm, 63
date, 26, 273
dd, 221, 230, 232 gcc
df, 228 compilation a partir d'un chier
di, 20, 211 source, 181
display, 95 compilation a partir de deux -
dmesg, 241 chiers sources, 183
dosemu, 272 compilation a partir de deux -
du, 28, 228 chiers sources en utilisant
dump, 219 des bibliotheques personnelles,
dvips, 110, 116 188
e2fsck, 269 gdb, 202
echo, 26 Utilisation avec Emacs, 209
editres, 62 Gestion des comptes utilisateurs, 224
egrep, 15 gestionnaire de fen^etres
Emacs, 99 fvwm, 63
congurer Emacs, 101 mwm, 82
Emacs et X window, 104 openwin, 78
env, 28 twm, 54
exit, 22 GID, 224
export, 28, 112, 123 gmon.out, 210
expressions rationnelles, 174 gprof, 210
grep, 14
fasthalt, 240 gro, 110
fdformat, 232, 242, 271 gs, 97, 249
fdisk, 230 gunzip, 216
INDEX 283
showrgb, 47 tr, 18
shutdown, 235, 240 tubes, 14
SIGHUP, 264 tunelp, 259
SIGPWR, 238 twm, 54
sleep, 94 associations de touches, 57
snapshot, 94 fonctions utilisateur, 56
sort, 17 menus, 58
startx, 44 variables, 55
strace, 210
strings, 267 UID, 224
stty, 26 ulimit, 209
su, 264 umask, 25
SuperProbe, 31 umount, 228
surcharge du systeme (evaluation), unalias, 28
24 uname, 26, 242
swap updatedb, 216
Creation d'une zone de swap, userdel, 225
230 vmlinuz, 231
Mettre hors service une zone de VT100, 237
swap, 231
swapo, 231 w, 265
swapon, 230 wait, 22
sxpm, 91 wc, 27
sync, 228, 230, 242 which, 29
syslogd, 264 who, 26, 265
Systeme de chiers whoami, 26
reparation, 265 wish, 153
t^ache de fond, 20 X
tail, 26 Lancement automatique, 46
tar, 217 Lancement normal, 44
Tcl (programmer avec), 143 Login graphique, 47
tclsh, 143 xbi, 51
tee, 19 xcalc, 49
TeX, 109 xclipboard, 54
Texinfo, 113 xclock, 48
time, 23 xdm, 47
Timezone, 272 xdvi, 97, 110, 116
Tk (programmer avec), 153 xearth, 98
tktex, 110 xfd, 54
touch, 230, 264 xg, 97
286 INDEX
xfontsel, 53
XFree86, 31
conguration, 32
installation, 31
la carte video, 40
le chier XF86Cong, 32
xinit, 44
xload, 98
xlock, 49
xlsfonts, 53
xmh, 51
xpaint, 91
xrdb, 61
xset, 52, 275
xsetroot, 50
xterm, 47, 264
xv, 50, 93, 96
xwd, 93
xwininfo, 61
xwud, 94
zcat, 217
zdump, 274
zic, 273