Creation minimaliste de scripts bash: empilement de commandes dans un
fichier.
On peut ecrire une liste de commandes dans un fichier, et demander a bash
de les executer. C'est un des moyens de repeter aisement une suite de commandes
qui peut etre longue.
Creer un fichier compile_latex dont le contenu sera:
latex toto
latex toto
xdvi toto &
Dans un repertoire contenant un document Latex toto.tex, executer la commande:
bash compile_latex
Ceci lance un nouveau bash, en lui demandant de lire le fichier
compile_latex et d'interpreter chaque commande qui s'y trouve. Ce
nouveau bash se termine des qu'il arrive a la fin des commandes, rendant
ainsi la main au bash d'origine.
Exercice: que se passe-t-il si on retire le & de la derniere
ligne? Interpreter...
Pour eviter d'avoir a indiquer explicitement le nom du shell a utiliser
(bash), on peut l'indiquer dans la premiere ligne sous la forme d'un pseudo-commentaire:
#!/bin/bash
Pour que le fichier compile_latex soit considere comme une commande par
bash, il faut maintenant le rendre executable. Pour cela, on utilise la commande
chmod:
chmod a+x compile_latex
Changement des droits sur un (ou plusieurs) fichier. Droits positionnes
par type (lecture, ecriture, execution), et par utilisateur (possesseur,
groupe, tous les autres). Syntaxe:
chmod [ugoa][+-=][rwx] fichier1 fichier2 ...
u: possesseur (user), g: groupe (toute la promo I1), o: autres (others),
a: tous (all); +/-: ajouter/retirer le(s) droit(s); =: ajouter ce(s) droit(s),
retirer les autes; r: lecture (read), w: ecriture (write), x: execution.
Mentionner le cas particulier des droits sur un repertoire (le droit d'ecriture
determine si un utilisateur peut ou non creer des fichiers a l'interieur
du repertoire; lecture et execution [le plus souvent a positionner ensemble]
determinent si l'utilisateur a la possibilite de voir les fichiers contenus
dans le repertoire, et de s'y deplacer.
Conseil global: ne pas oublier de verifier les droits sur un fichier script
que l'on vient de creer.
Essayer la commande ls -l compile_latex avant et apres le chmod.
On peut desormais executer ce script avec la commande:
(chemin)/compile_latex
Il faut preciser le chemin, parce que, selon toute vraisemblance, le repertoire
ou se trouve le fichier n'apparait pas dans la variable d'environnement PATH.
Ajouter (pour la session seulement!) ce repertoire dans le PATH:
PATH=$PATH:(chemin absolu du repertoire)
(Insister sur le fait qu'il est preferable de rajouter le repertoire en
fin de liste plutot qu'en debut, et qu'il vaut mieux ne pas avoir le repertoire
courant dans la liste.)
Creer un repertoire bin dans le repertoire principal, et ajouter
pour la session ce repertoire dans le PATH. Tous les scripts du jour seront
crees dans ce repertoire.
Le script precedent manque d'interet: il ne peut servir a compiler qu'un
fichier au nom fixe. On peut cependant invoquer un script avec des arguments,
lesquels seront disponibles comme variables $1, $2, etc.
Exercice: modifier le script compile_latex pour qu'il
puisse etre invoque avec le nom (sans .tex) en argument: compile_latex
toto
Exercice: dans le meme esprit, ecrire un script compile_C permettant
de passer d'un fichier source C (contenant un programme complet) en executable.
Utiliser une variable CC pour indiquer le nom du compilateur (gcc),
ainsi qu'une variable OPTIONS pour les options que l'on desire utiliser systematiquement
(-g -Wall), ce qui permettrait, le cas echeant, de modifier ces
parametres sans avoir a modifier le script (pour le cas ou il deviendrait
plus complexe; exemple: compilation d'un programme multi-fichier)
Exercice: ecrire un script nettoie qui detruit tous les
fichiers .aux, .dvi, .toc, .log, ainsi que les fichiers dont le
nom se termine par un ~, dans le repertoire courant. En lisant le man de
rm, ecrire une version du script qui demande confirmation pour chaque
fichier, et une version qui ne demande jamais confirmation.
La commande set permet de "decouper" une ligne de texte en "champs", lesquels
sont places dans les variables $1, $2, etc. La commande date indique la date
et l'heure; utiliser set `date` pour ecrire un script qui affiche l'heure
sous la forme:
Il est 11:50:28.
Exercice: modifier le script pour qu'il ecrive l'heure sous la forme:
Il est 11h 50min 28s.
(indication: la variable IFS sert a bash a determiner quels sont
les caracteres qui separent les champs; par defaut, cela n'inclut pas le
caractere :)