• Aucun résultat trouvé

Utilisation des alias

Le m´ecanisme des alias donne acc`es `a des commandes cach´ees de fa¸con `a garantir qu’elles ne pr´esentent pas de danger et que l’on puisse ex´ecuter un script potentiel- lement dangereux dans un interpr´eteur s´ecuris´e avec des alias dont la cible est dans un interpr´eteur r´eput´e sˆur (en g´en´eral le maˆıtre). Le point d´elicat est de garantir que l’information pass´ee par l’interpr´eteur esclave au maˆıtre ne soit pas ´evalu´ee ou interpol´ee dans le maˆıtre.

Lorsque la source d’un alias est invoqu´ee dans l’interpr´eteur esclave, les substi- tutions habituelles de Tcl sont effectu´ees au moment de l’analyse de la commande. Ces substitutions ont lieu dans l’interpr´eteur source (c’est-`a-dire l’interpr´eteur es- clave s´ecuris´e) comme c’est le cas pour toutes les autres commandes appel´ees dans

cet interpr´eteur. Les arguments de la commande source sont ajout´es aux argu- ments arg de CommandeCible d´eclar´es `a la cr´eation de l’alias : par exemple, si la commande source a la syntaxe suivante

CommandeSource arg1 arg2... argN alors la nouvelle commande sera :

CommandeCible arg arg... arg arg1 arg2... argN

La commande CommandeCible est en principe une commande existant dans l’interpr´eteur cible sinon il y aura une erreur. Aucune substitution nouvelle n’est effectu´ee : la commande cible est ´evalu´ee directement sans repasser par un cycle d’interpolations dans l’interpr´eteur cible. Les arguments CommandeCible et args ont donc ´et´e interpol´es au moment de l’analyse de la commande qui avait cr´e´e l’alias et les arguments arg1 - argN au moment o`u la commande source de l’alias a ´et´e analys´ee dans l’interpr´eteur source.

Il est donc important lorsqu’on ´ecrit la proc´edure CommandeCible que les ar- guments de cette commande ne soient ni substitu´es, ni ´evalu´es dans le cadre de la d´efinition de la proc´edure.

Commandes cach´ees

Il arrive cependant que l’on ait besoin d’autoriser l’utilisation de certaines com- mandes qui ne sont en principe pas disponibles dans des interpr´eteurs s´ecuris´es. La commande interp dispose d’un m´ecanisme pour cela : plutˆot que de retirer compl`etement les commandes dangereuses, celles-ci sont en r´ealit´e cach´ees ce qui les rend indisponibles pour des scripts Tcl ex´ecut´es dans cet interpr´eteur. N´eanmoins ces commandes peuvent ˆetre invoqu´ees dans un parent consid´er´e comme sˆur de l’interpr´eteur s´ecuris´e en utilisant la commande interp invoke. Les commandes cach´ees et les commandes expos´ees r´esident dans des espaces de noms s´epar´es. Il est possible de d´efinir une commande cach´ee et une commande expos´ee de mˆeme nom au sein d’un mˆeme interpr´eteur. Des commandes cach´ees d’un interpr´eteur esclave peuvent ˆetre invoqu´ees dans le corps de d´efinition de proc´edures appel´ees dans le maˆıtre au cours de l’invocation d’un alias. `A titre d’exemple, supposons que l’on ait cr´e´e un alias pour la commande source dans un interpr´eteur esclave. Lorsque cet alias est invoqu´e dans l’interpr´eteur esclave, une proc´edure correspon- dante est appel´ee dans l’interpr´eteur maˆıtre : cette proc´edure pourrait consister `a v´erifier que le fichier `a sourcer est un fichier autoris´e et donc demander qu’il soit sourc´e dans l’interpr´eteur esclave. Il y a ici deux commandes appel´ees source dans l’interpr´eteur esclave : l’alias et la commande cach´ee.

Les interpr´eteurs s´ecuris´es ne sont pas autoris´es `a invoquer des commandes cach´ees `a l’int´erieur d’eux-mˆemes ou de leurs descendants, ceci afin d’empˆecher des interpr´eteurs esclaves d’avoir acc`es `a leurs fonctionnalit´es cach´ees.

L’ensemble des commandes cach´ees dans un interpr´eteur peut ˆetre manipul´e par un interpr´eteur sˆur en utilisant les commandes interp expose ou bien interp hide. La premi`ere d´eplace une commande cach´ee dans l’ensemble des commandes expos´ees de l’interpr´eteur d´esign´e par l’argument nomInterp, en la renommant au passage (si une commande de ce nom existe d´ej`a dans l’interpr´eteur cible, il y aura

. interp 106 erreur). Inversement interp hide d´eplace une commande expos´ee dans l’ensemble des commandes cach´ees de l’interpr´eteur. Les interpr´eteurs s´ecuris´es n’ont pas le droit de d´eplacer des commandes entre les commandes cach´ees et les commandes expos´ees, ni `a l’int´erieur d’eux-mˆemes, ni de leurs descendants.

Les noms de commandes cach´ees ne peuvent contenir de qualificateurs d’espaces de noms et il faut renommer une commande dans l’espace de noms courant avant de pouvoir en faire une commande cach´ee. Les commandes que l’on cache au moyen de interp hide sont recherch´ees dans l’espace global mˆeme si l’espace de noms courant est diff´erent.

join

La commande join cr´ee une chaˆıne en joignant ensemble des ´el´ements de liste.

Syntaxe

join Liste?Jonction?

Description

L’argument Liste doit repr´esenter une liste Tcl valide. Cette commande renvoie une chaˆıne form´ee en joignant les divers ´el´ements de la liste au moyen de l’´el´ement d´esign´e par l’argument Jonction. Si l’argument Jonction n’est pas sp´ecifi´e, c’est une espace qui est utilis´ee par d´efaut. Si l’on veut qu’il n’y ait pas d’´el´ement de jonction entre les ´el´ements, on indiquera explicitement une chaˆıne vide "" comme argument Jonction. Par exemple :

set l [list a b c d e f] join $l join $l "-*-" join $l "" produiront respectivement a b c d e f a-*-b-*-c-*-d-*-e-*-f abcdef

. lappend 108

lappend

La commande lappend adjoint des ´el´ements de liste `a une variable.

Syntaxe

lappend NomVar?Valeur Valeur Valeur...?

Description

Cette commande traite la variable NomVar comme une liste et lui adjoint cha- cun des arguments Valeur comme nouveaux ´el´ements s´epar´es les uns des autres par une espace. Si la variable NomVar n’existe pas d´ej`a, elle est cr´e´ee en tant que liste ayant pour ´el´ements les arguments Valeur. Il ne faut pas confondre cette commande lappend avec la commande append (cf p.13) qui adjoint des valeurs `a une variable de type chaˆıne.

lindex

La commande lindex permet de r´ecup´erer les ´el´ements d’une liste.

Syntaxe

lindex Liste?indice. . . ?

Description

Cette commande traite l’argument qui lui est pass´e comme une liste Tcl. Si aucun argument indice n’est sp´ecifi´e, la commande renvoie simplement le nom de la liste. Si l’on sp´ecifie un indice de valeur n alors la commande renvoie le n-i`eme ´el´ement de la liste, l’indice 0 correspondant au premier ´el´ement de la liste. En ex- trayant un ´el´ement, la commande lindex observe les mˆemes r`egles concernant les accolades, guillemets et contre-obliques que l’interpr´eteur Tcl lui-mˆeme mais n’ef- fectue aucune substitution ou interpolation de variables ou de commandes. Chaque ´el´ement est trait´e textuellement.

Si n est n´egatif ou sup´erieur ou ´egal au nombre d’´el´ements de la liste alors une chaˆıne vide est renvoy´ee. On peut utiliser la constante symbolique end pour d´esigner le dernier ´el´ement de la liste et appliquer `a cette constante des op´erations arithm´etiques de la forme end-n pour d´esigner un d´ecalage par rapport `a la fin de la liste. end-1 sera ainsi l’avant-dernier ´el´ement de la liste et ainsi de suite. Ce d´ecalage peut aussi ˆetre la valeur d’une autre variable : si la variable a vaut 1, on peut ainsi utiliser la syntaxe end-$a pour d´esigner l’avant-dernier ´el´ement.

Si des indices suppl´ementaires sont pass´es en argument, chaque argument est utilis´e `a tour de rˆole pour s´electionner un sous-´el´ement de l’´el´ement pr´ec´edemment extrait s’il est lui-mˆeme une liste. La commande

lindex $a {1 2 3} est synonyme de

lindex [lindex [lindex $a 1] 2] 3

La possibilit´e de sp´ecifier plus d’un indice en argument a ´et´e introduite avec la version 8.4 de Tcl. En voici quelques exemples :

Commande R´esultat lindex {a b c} a b c lindex {a b c} {} a b c lindex {a b c} 0 a lindex {a b c} 2 c lindex {a b c} end c lindex {a b c} end-1 b

lindex {{a b c} {d e f} {g h i}} 2 1 h lindex {{a b c} {d e f} {g h i}} {2 1} h lindex {{{a b} {c d}} {{e f} {g h}}} 1 1 0 g lindex {{{a b} {c d}} {{e f} {g h}}} {1 1 0} g

. linsert 110

linsert

La commande linsert ins`ere des ´el´ements dans une liste.

Syntaxe

linsert Liste Indice ´El´ement? ´El´ement ´El´ement...?

Description

Cette commande cr´ee une nouvelle liste `a partir de la liste Liste en ins´erant tous les arguments ´El´ement juste avant l’´el´ement d’indice Indice. Chaque argument devient un ´el´ement s´epar´e de la nouvelle liste. Si l’indice Indice est n´egatif ou nul, les ´el´ements sont ins´er´es au d´ebut de la liste ; s’il est sup´erieur ou ´egal au nombre d’´el´ements de la liste ou bien s’il est repr´esent´e par la constante symbolique end, alors les ´el´ements sont ajout´es en fin de liste. Les mˆemes r`egles arithm´etiques qu’avec la commande lindex concernant la constante end s’appliquent ici.

list