Newer
Older
cours-unix-shell / UnixShell_cours2018 / corrigeShell.fre.html
<html>
  <head>
    
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
    <link REL="STYLESHEET" TYPE="text/css" TITLE="Style DILIB" HREF="../../dilib.css">
    <style type="text/css">
      
    </style>
    <title>Corrig&eacute; du TP - Shell - UNIX</title>
  </head>

  <body>
    <h1>Corrig&eacute; du TP - Shell - UNIX</h1>

    <p class="remarque">
      Tous les shells qui seront cr&eacute;&eacute;s par la suite
      devront avoir le droit d'ex&eacute;cution correctement
      positionn&eacute;, au moins pour leur propri&eacute;taire.
    </p>

    <h2>
      Recherche d'information sur un utilisateur
    </h2>

    <ol>
      <li><a name="fichier"></a>
	<p>
	  &Eacute;crivez un shell qui permette de chercher si un
	  utilisateur d'un nom donn&eacute; existe sur votre machine,
	  en affichant sa r&eacute;f&eacute;rence compl&egrave;te
	  (c'est-&agrave;-dire sans aucun filtrage).<br>
	
	  Le nom recherch&eacute; sera pass&eacute; comme
	  param&egrave;tre au shell.<br>

	  La recherche portera dans le fichier
	  <code>/etc/passwd</code>.
	</p>

	<a href="tpShell.fre.html#name_fichier">Retour</a>
	<pre class="script"><span class="comment"># Fichier "infouser1.sh"
#!/bin/sh</span>
grep $1 /etc/passwd</pre>
	<hr>
      </li>
      <li>
	<a name="param1"></a>
	<p>
	  Modifiez ce script shell pour qu'il teste si un
	  param&egrave;tre est bien pass&eacute; en ligne. En cas
	  d'erreur (aucun param&egrave;tre ou plus d'un), un message
	  sera affich&eacute; expliquant la bonne syntaxe &agrave;
	  suivre.
	</p>
	<a href="tpShell.fre.html#name_param1">Retour</a>
	  <pre class="script"><span class="comment"># Fichier "infouser2.sh"
#!/bin/sh</span>

if test $# -ne 1
then
	echo Mauvais nombre de parametres.
	echo
	echo Usage: $0 uid
	exit 1
fi

grep $1 /etc/passwd</pre>
	<hr>
      </li>

      <li><a name="utilisateur"></a>
	<p>
	  Modifiez encore ce shell pour qu'il teste si l'utilisateur
	  demand&eacute; existe sur votre machine. En cas d'absence,
	  affichez un message d'avertissement.
	</p>

	<a href="tpShell.fre.html#name_utilisateur">Retour</a>
	<pre class="script"><span class="comment"># Fichier "infouser3.sh"
#!/bin/sh</span>

if test $# -ne 1
then
	echo Mauvais nombre de parametres.
	echo
	echo Usage: $0 [uid]
	exit 1
fi

if test `grep $1 /etc/passwd | wc -l` -lt 1
then
	echo L\'utilisateur $1 n\'est pas cr&eacute;&eacute; sur cette machine.
	exit 2
fi

grep $1 /etc/passwd</pre>
	<p class="remarque">
	  Par d&eacute;faut, le shell s'arr&ecirc;te avec un statut &agrave; z&eacute;ro, c'est
	  pourquoi une ligne <code>exit 0</code> &agrave; la fin du programme
	  est superflue.
	</p>
	<p class="remarque">
	  Le test effectu&eacute; est <code>-lt 1</code> (plus petit que 1),
	  mais on aurait tout aussi bien pu faire <code>-eq 0</code>.
	</p>
	<p class="remarque">
	  Le texte de sortie contient des <code>\'</code>, pour que le
	  shell n'interpr&egrave;te pas ce caract&egrave;re sp&eacute;cial comme une quote,
	  mais comme une apostrophe (texte normal, et pas caract&egrave;re
	  sp&eacute;cial).
	</p>
	<p class="remarque">
	  On aurait pu aussi utiliser un test plus simple sur le
	  r&eacute;sultat de <code>grep $1 /etc/passwd</code>, et le
	  transformer en <code>if test ! $?</code>.
	</p>
      </li>
    </ol>

    <h2>
      &Eacute;dition de statistiques sur un corpus XML
    </h2>
    <p>
      Pour cette partie du TP, il vous faut d'abord r&eacute;cup&eacute;rer
      les deux corpus suivants&nbsp;:<br>
      <a href="corpus1.xml.gz"><code>corpus1.xml.gz</code></a><br>
      <a href="corpus2.xml.gz"><code>corpus2.xml.gz</code></a><br>
      Ces deux fichiers contiennent 25 notices en XML Dilib, leur exploration
      pr&eacute;paratoire est conseill&eacute;e.
    </p>

    <ol>
      <li><a name="resume1"></a>
	<p>
	  &Eacute;crivez un script shell qui &eacute;dite le
	  pourcentage de r&eacute;sum&eacute;s, pour chacun des deux
	  corpus, en passant le nom de fichier en
	  param&egrave;tre.<br>

	  <span class="attention"> Les fichiers ne devront
	  jamais &ecirc;tre d&eacute;compress&eacute;s sur
	  disque.</span><br>

	  L'&eacute;l&eacute;ment r&eacute;sum&eacute; se nomme
	  <code>fC01</code>.
	</p>

	  <a href="tpShell.fre.html#name_resume1">Retour</a>
	  <pre class="script"><span class="comment"># Fichier "resume1.sh"
#!/bin/sh</span>

if test $# -ne 1
then
	echo Mauvais nombre de parametres.
	echo
	echo Usage: $0 fichier
	exit 1
fi

NB_LIGNES=`gzcat $1|wc -l`
NB_RESUMES=`gzcat $1|grep fC01|wc -l`

NB_RES_100=`expr 100 \* $NB_RESUMES`
POURCENTAGE=`expr $NB_RES_100 / $NB_LIGNES`

echo Pourcentage de notices avec r&eacute;sum&eacute; dans $1: ${POURCENTAGE}%</pre>
	  <p class="remarque">
	    N'oubliez pas de banaliser l'op&eacute;rateur de multiplication,
	    sinon <code>expr</code> ne comprendra pas ce que vous
	    demandez (<code>man expr</code> pour plus de d&eacute;tails).
	  </p>
	  <p class="remarque">
	    <code>gzcat</code> est utilis&eacute;, mais on pourrait aussi
	    utiliser <code>gunzip -c</code>.
	  </p>
	<hr>
      </li>
      <li><a name="resume2"></a>
	<p>
	  Modifiez le shell pr&eacute;c&eacute;dent pour qu'il teste
	  l'existence du fichier demand&eacute; avant traitement, puis
	  pour qu'il sorte les r&eacute;sultats dans un fichier
	  nomm&eacute; <code>resultatsfC01.txt</code>.
	</p>

	  <a href="tpShell.fre.html#name_resume2">Retour</a>
	  <pre class="script"><span class="comment"># Fichier "resume2.sh"
#!/bin/sh</span>

if test $# -ne 1
then
	echo Mauvais nombre de parametres.
	echo
	echo Usage: $0 fichier
	exit 1
fi

if test ! -f $1
then
	echo $1 "n'existe pas (ou n'est pas un fichier)."
	exit 2
fi

NB_LIGNES=`gzcat $1|wc -l`
NB_RESUMES=`gzcat $1|grep fC01|wc -l`

NB_RES_100=`expr 100 \* $NB_RESUMES`
POURCENTAGE=`expr $NB_RES_100 / $NB_LIGNES`

echo Pourcentage de notices avec r&eacute;sum&eacute; dans $1: ${POURCENTAGE}% > resultatsfC01.txt</pre>
	  <p class="remarque">
	    Cette fois, on a mis la cha&icirc;ne contenant les apostrophes
	    (caract&egrave;re sp&eacute;cial) entre guillemets pour les banaliser.
	  </p>
	<hr>
      </li>
      <li><a name="resume3"></a>
	<p>
	  &Eacute;crivez un script shell qui, pour les deux corpus et
	  en testant l'existence du fichier demand&eacute;, calcule le
	  pourcentage de notices sans r&eacute;sum&eacute;, le
	  pourcentage de notices de type p&eacute;riodique et le
	  pourcentage de notices de langue fran&ccedil;aise.<br>

	  La liste des &eacute;l&eacute;ments &agrave; prendre en
	  compte sera pass&eacute;e en param&egrave;tres en ligne au
	  shell et ceux-ci seront trait&eacute;s en boucle avec un
	  <code>while</code>.<br>

	  Les statistiques obtenues seront
	  r&eacute;cup&eacute;r&eacute;es dans le fichier
	  <code>resultatsMulti.txt</code>.<br>

	  Les &eacute;l&eacute;ments &agrave; utiliser sont
	  <code>fA60</code> pour le type de document (<code>P</code>
	  pour p&eacute;riodique) et <code>fA23</code> pour la langue
	  (<code>FRE</code> pour la langue fran&ccedil;aise).
	</p>

	  <a href="tpShell.fre.html#name_resume3">Retour</a>
	  <pre class="script"><span class="comment"># Fichier "resume3.sh"
#!/bin/sh</span>

if test $# -lt 1
then
	echo Mauvais nombre de parametres.
	echo
	echo Usage: $0 fichier...
	exit 1
fi

rm -f resultatsMulti.txt

while test $# -ne 0
do
	if test ! -f $1
	then
		echo $1 "n'existe pas (ou n'est pas un fichier)."
		exit 2
	fi

	echo ----------- >> resultatsMulti.txt
	echo $1 >> resultatsMulti.txt
	echo ----------- >> resultatsMulti.txt

	NB_LIGNES=`gzcat $1|wc -l`
	NB_SANS_RESUME=`gzcat $1|grep -v fC01|wc -l`
	NB_PERIODIQUES=`gzcat $1|grep "fA60&gt;&lt;s1&gt;P&lt;/"|wc -l`
	NB_FRANCAIS=`gzcat $1|grep "fA23 i1=\"01\"&gt;&lt;s0&gt;FRE&lt;/"|wc -l`

	NB_SANS_RES_100=`expr 100 \* $NB_SANS_RESUME`
	POURCENTAGE_SANS_RES=`expr $NB_SANS_RES_100 / $NB_LIGNES`

	echo "Pourcentage de notices sans r&eacute;sum&eacute;        : ${POURCENTAGE_SANS_RES}%" \
		 >> resultatsMulti.txt

	NB_PERIO_100=`expr 100 \* $NB_PERIODIQUES`
	POURCENTAGE_PERIODIQUES=`expr $NB_PERIO_100 / $NB_LIGNES`

	echo "Pourcentage de notices de type p&eacute;riodique : ${POURCENTAGE_PERIODIQUES}%" \
		>> resultatsMulti.txt

	NB_FRANCAIS_100=`expr 100 \* $NB_FRANCAIS`
	POURCENTAGE_FRANCAIS=`expr $NB_FRANCAIS_100 / $NB_LIGNES`

	echo "Pourcentage de notices fran&ccedil;aises         : ${POURCENTAGE_FRANCAIS}%" \
		>> resultatsMulti.txt

	shift
done</pre>
	  <p class="remarque">
	    <code>shift</code> est utilis&eacute; pour parcourir tous les
	    param&egrave;tres et consid&eacute;rer chacun d'entre eux comme le
	    param&egrave;tre num&eacute;ro 1.
	  </p>
	  <p class="remarque">
	    Le <code>rm -f resultatsMulti.txt</code> est l&agrave; pour
	    &eacute;viter la concat&eacute;nation des r&eacute;sultats avec ceux des
	    ex&eacute;cutions pr&eacute;c&eacute;dentes du m&ecirc;me script.
	  </p>
	  <p class="remarque">
	    Pour plus de pr&eacute;cision, on pourrait utiliser la commande
	    DILIB <code>SgmlSelect</code> plut&ocirc;t que
	    <code>grep</code>, pour s&eacute;lectionner les notices
	    fran&ccedil;aises (en effet, si l'attribut i1 changeait, la
	    commande de comptage deviendrait plus compliqu&eacute;e avec
	    <code>grep</code>).
	  </p>
	  <p class="remarque">
	    Le caract&egrave;re <code>\</code> en fin de ligne permet de
	    passer &agrave; la ligne sans interrompre la commande. C'est une
	    facilit&eacute; de pr&eacute;sentation.
	  </p>
	  <p>
	    <a href="tpShell.fre.html#name_resume3">Retour</a>
	  </p>
	<hr>
      </li>
      <li><a name="resume4"></a>
	<p>
	  Modifiez le shell pr&eacute;c&eacute;dent pour que le
	  fichier r&eacute;sultat soit compress&eacute; au choix
	  (Oui/Non).
	</p>

	  <a href="tpShell.fre.html#name_resume4">Retour</a>
	  <pre class="script"><span class="comment"># Fichier "resume4.sh"
#!/bin/sh</span>

if test $# -lt 1
then
	echo Mauvais nombre de parametres.
	echo
	echo Usage: $0 [-z] fichier...
	exit 1
fi

rm -f resultatsMulti.txt*

COMPRESSION=0

while test $# -ne 0
do
	case $1 in
	-z )	COMPRESSION=1 ;;
	* )
		if test ! -f $1
		then
			echo $1 "n'existe pas (ou n'est pas un fichier)."
			exit 2
		fi

		echo ----------- >> resultatsMulti.txt
		echo $1 >> resultatsMulti.txt
		echo ----------- >> resultatsMulti.txt

		NB_LIGNES=`gzcat $1|wc -l`
		NB_SANS_RESUME=`gzcat $1|grep -v fC01|wc -l`
		NB_PERIODIQUES=`gzcat $1|grep "fA60&gt;&lt;s1&gt;P&lt;/"|wc -l`
		NB_FRANCAIS=`gzcat $1|grep "fA23 i1=\"01\"&gt;&lt;s0&gt;FRE&lt;/"|wc -l`

		NB_SANS_RES_100=`expr 100 \* $NB_SANS_RESUME`
		POURCENTAGE_SANS_RES=`expr $NB_SANS_RES_100 / $NB_LIGNES`

		echo "Pourcentage de notices sans r&eacute;sum&eacute;        : ${POURCENTAGE_SANS_RES}%" \
			>> resultatsMulti.txt

		NB_PERIO_100=`expr 100 \* $NB_PERIODIQUES`
		POURCENTAGE_PERIODIQUES=`expr $NB_PERIO_100 / $NB_LIGNES`

		echo "Pourcentage de notices de type p&eacute;riodique : ${POURCENTAGE_PERIODIQUES}%" \
			 >> resultatsMulti.txt

		NB_FRANCAIS_100=`expr 100 \* $NB_FRANCAIS`
		POURCENTAGE_FRANCAIS=`expr $NB_FRANCAIS_100 / $NB_LIGNES`

		echo "Pourcentage de notices fran&ccedil;aises         : ${POURCENTAGE_FRANCAIS}%" \
			 >> resultatsMulti.txt
		;;
	esac

	shift
done

if test $COMPRESSION -eq 1
then
	touch resultatsMulti.txt
	gzip resultatsMulti.txt
fi</pre>
	  <p class="remarque">
	    L'utilisation du <code>case</code> &agrave; l'int&eacute;rieur du
	    <code>while</code> autorise l'apparition de l'option
	    <code>-z</code> n'importe o&ugrave; sur la ligne de commande.
	  </p>
	  <p class="remarque">
	    L'instruction <code>touch resultatsMulti.txt</code>
	    permet, lorsqu'aucun fichier n'a &eacute;t&eacute; pass&eacute; en param&egrave;tre,
	    et que l'option <code>-z</code> a &eacute;t&eacute; s&eacute;lectionn&eacute;e, de ne
	    pas avoir de message d'erreur: <code>resultatsMulti.txt:
	    No such file or directory</code>. On ne peut pas
	    compresser un fichier qui n'existe pas. <code>touch</code>
	    modifie la date de derni&egrave;re modification d'un fichier,
	    <em>mais aussi</em> elle cr&eacute;e un fichier lorsqu'il
	    n'existe pas.
	  </p>
	  <p>
	    <a href="tpShell.fre.html#name_resume4">Retour</a>
	  </p>
	<hr>
      </li>
      <li><a name="resume5"></a>
	<p>
	  Reprenez le shell pr&eacute;c&eacute;dent pour que le
	  fichier r&eacute;sultat soit nomm&eacute; avec une
	  indication de date/heure &agrave; l'aide de la commande
	  <code>date</code> d'Unix (notion de mise &agrave;
	  jour).

	  ATTENTION ! On consid&egrave;rera le fichier
	  <code>corpus2.xml.gz</code> comme une mise &agrave; jour de
	  <code>corpus1.xml.gz</code>. Leur diff&eacute;rence de
	  nommage pourra par exemple &ecirc;tre li&eacute;e
	  plut&ocirc;t &agrave; l'heure qu'&agrave; la date.-->
	</p>

	  <a href="tpShell.fre.html#name_resume5">Retour</a>
	  <pre class="script"><span class="comment"># Fichier "resume5.sh"
#!/bin/sh</span>

if test $# -lt 1
then
	echo Mauvais nombre de parametres.
	echo
	echo Usage: $0 [-z] fichier...
	exit 1
fi

NOM_FICHIER=resultatsMulti`date '+%H%M%S'`.txt

COMPRESSION=0

while test $# -ne 0
do
	case $1 in
	-z )	COMPRESSION=1 ;;
	* )
		if test ! -f $1
		then
			echo $1 "n'existe pas (ou n'est pas un fichier)."
			exit 2
		fi

		echo ----------- >> $NOM_FICHIER
		echo $1 >> $NOM_FICHIER
		echo ----------- >> $NOM_FICHIER

		NB_LIGNES=`gzcat $1|wc -l`
		NB_SANS_RESUME=`gzcat $1|grep -v fC01|wc -l`
		NB_PERIODIQUES=`gzcat $1|grep "fA60&gt;&lt;s1&gt;P&lt;/"|wc -l`
		NB_FRANCAIS=`gzcat $1|grep "fA23 i1=\"01\"&gt;&lt;s0&gt;FRE&lt;/"|wc -l`

		NB_SANS_RES_100=`expr 100 \* $NB_SANS_RESUME`
		POURCENTAGE_SANS_RES=`expr $NB_SANS_RES_100 / $NB_LIGNES`

		echo "Pourcentage de notices sans r&eacute;sum&eacute;        : ${POURCENTAGE_SANS_RES}%" \
			>> $NOM_FICHIER

		NB_PERIO_100=`expr 100 \* $NB_PERIODIQUES`
		POURCENTAGE_PERIODIQUES=`expr $NB_PERIO_100 / $NB_LIGNES`

		echo "Pourcentage de notices de type p&eacute;riodique : ${POURCENTAGE_PERIODIQUES}%" \
			 >> $NOM_FICHIER

		NB_FRANCAIS_100=`expr 100 \* $NB_FRANCAIS`
		POURCENTAGE_FRANCAIS=`expr $NB_FRANCAIS_100 / $NB_LIGNES`

		echo "Pourcentage de notices fran&ccedil;aises         : ${POURCENTAGE_FRANCAIS}%" \
			 >> $NOM_FICHIER
		;;
	esac

	shift
done

if test $COMPRESSION -eq 1
then
	touch $NOM_FICHIER
	gzip $NOM_FICHIER
fi</pre>
	  <p>
	    <a href="tpShell.fre.html#name_resume5">Retour</a>
	  </p>
	<hr>
      </li>
      <li><a name="cumul"></a>
	<p>
	  &Eacute;crivez un shell qui, reprenant les exercices
	  pr&eacute;c&eacute;dents, calcule les statistiques sur le
	  fichier <code>corpus1.xml.gz</code>, puis stocke les
	  r&eacute;sultats en compress&eacute;. Ensuite, le m&ecirc;me
	  traitement sera port&eacute; sur <code>corpus2.xml.gz</code>
	  consid&eacute;r&eacute; comme une mise &agrave; jour
	  cumulative des statistiques (c'est-&agrave;-dire qu'il n'y
	  aura qu'un seul fichier r&eacute;sultat repris puis
	  &eacute;cras&eacute; au second traitement).
	</p>

	  <a href="tpShell.fre.html#name_cumul">Retour</a>
	  <pre class="script"><span class="comment"># Fichier "resume6.sh"
#!/bin/sh</span>

if test $# -lt 1
then
	echo Mauvais nombre de parametres.
	echo
	echo Usage: $0 [-z] fichier...
	exit 1
fi

NOM_FICHIER=resultatsMulti`date '+%H%M%S'`.txt

COMPRESSION=0

CUMUL_NB_LIGNES=0
CUMUL_NB_SANS_RESUME=0
CUMUL_NB_PERIODIQUES=0
CUMUL_NB_FRANCAIS=0

while test $# -ne 0
do
	case $1 in
	-z )	COMPRESSION=1 ;;
	* )
		if test ! -f $1
		then
			echo $1 "n'existe pas (ou n'est pas un fichier)."
			exit 2
		fi

		echo ----------- >> $NOM_FICHIER
		echo $1 >> $NOM_FICHIER
		echo ----------- >> $NOM_FICHIER

		NB_LIGNES=`gzcat $1|wc -l`
		NB_SANS_RESUME=`gzcat $1|grep -v fC01|wc -l`
		NB_PERIODIQUES=`gzcat $1|grep "fA60&gt;&lt;s1&gt;P&lt;/"|wc -l`
		NB_FRANCAIS=`gzcat $1|grep "fA23 i1=\"01\"&gt;&lt;s0&gt;FRE&lt;/"|wc -l`

		CUMUL_NB_LIGNES=`expr $CUMUL_NB_LIGNES + $NB_LIGNES`
		CUMUL_NB_SANS_RESUME=`expr $CUMUL_NB_SANS_RESUME + $NB_SANS_RESUME`
		CUMUL_NB_PERIODIQUES=`expr $CUMUL_NB_PERIODIQUES + $NB_PERIODIQUES`
		CUMUL_NB_FRANCAIS=`expr $CUMUL_NB_FRANCAIS + $NB_FRANCAIS`

		NB_SANS_RES_100=`expr 100 \* $NB_SANS_RESUME`
		POURCENTAGE_SANS_RES=`expr $NB_SANS_RES_100 / $NB_LIGNES`

		echo "Pourcentage de notices sans r&eacute;sum&eacute;        : ${POURCENTAGE_SANS_RES}%" \
			>> $NOM_FICHIER

		NB_PERIO_100=`expr 100 \* $NB_PERIODIQUES`
		POURCENTAGE_PERIODIQUES=`expr $NB_PERIO_100 / $NB_LIGNES`

		echo "Pourcentage de notices de type p&eacute;riodique : ${POURCENTAGE_PERIODIQUES}%" \
			 >> $NOM_FICHIER

		NB_FRANCAIS_100=`expr 100 \* $NB_FRANCAIS`
		POURCENTAGE_FRANCAIS=`expr $NB_FRANCAIS_100 / $NB_LIGNES`

		echo "Pourcentage de notices fran&ccedil;aises         : ${POURCENTAGE_FRANCAIS}%" \
			 >> $NOM_FICHIER
		;;
	esac

	shift
done

if test $CUMUL_NB_LIGNES -gt 0
then
	NB_SANS_RES_100=`expr 100 \* $CUMUL_NB_SANS_RESUME`
	POURCENTAGE_SANS_RES=`expr $NB_SANS_RES_100 / $CUMUL_NB_LIGNES`

	NB_PERIO_100=`expr 100 \* $CUMUL_NB_PERIODIQUES`
	POURCENTAGE_PERIODIQUES=`expr $NB_PERIO_100 / $CUMUL_NB_LIGNES`

	NB_FRANCAIS_100=`expr 100 \* $CUMUL_NB_FRANCAIS`
	POURCENTAGE_FRANCAIS=`expr $NB_FRANCAIS_100 / $CUMUL_NB_LIGNES`

	echo --------------- CUMUL >> $NOM_FICHIER
	echo "Pourcentage de notices sans r&eacute;sum&eacute;        : ${POURCENTAGE_SANS_RES}%" \
		>> $NOM_FICHIER
	echo "Pourcentage de notices de type p&eacute;riodique : ${POURCENTAGE_PERIODIQUES}%" \
		 >> $NOM_FICHIER
	echo "Pourcentage de notices fran&ccedil;aises         : ${POURCENTAGE_FRANCAIS}%" \
		 >> $NOM_FICHIER
fi

if test $COMPRESSION -eq 1
then
	touch $NOM_FICHIER
	gzip $NOM_FICHIER
fi</pre>
	  <p class="remarque">
	    On teste le nombre de lignes cumul&eacute;es, car dans le cas o&ugrave;
	    aucun fichier n'aurait &eacute;t&eacute; trait&eacute;, la variable
	    <code>CUMUL_NB_LIGNES</code> vaudrait z&eacute;ro, et
	    occasionnerait une erreur lors de la division!
	  </p>
	  <p>
	    <a href="tpShell.fre.html#name_cumul">Retour</a>
	  </p>
	<hr>
      </li>
    </ol>

    <hr>
    <address><a href="mailto:philippe.houdry@inist.fr">Philippe.Houdry@inist.fr</a></address>
  </body>
</html>