Bash IV




Creation minimaliste de scripts bash: empilement de commandes dans un fichier.

Principes

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

La commande chmod

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.

Scripts a arguments


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

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 :)