projman/hlp/fr/tcl/interp.htm

433 lines
32 KiB
HTML
Raw Normal View History

2015-10-19 13:27:31 +03:00
<HTML><HEAD>
<BASEFONT FACE="Times New Roman" SIZE="2" COLOR="#000000">
</HEAD>
<BODY>
<div><H3><b>interp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Commandes Internes Tcl</b></H3></div>
<HR ALIGN="center">
<div><b>NOM</b></div> <br>
<div ALIGN="LEFT" style="margin-left: 51px;">interp - Cr<43>e et manipule des interpr<70>teurs Tcl
</div> <br>
<div><b>SYNTAXE</b></div> <br>
<div ALIGN="LEFT" style="margin-left: 51px;"><b>interp </b><i>option </i>?<i>arg arg ...</i>?&nbsp;
</div><br>
<div><b>DESCRIPTION</b></div> <br>
<div ALIGN="LEFT" style="margin-left: 51px;">Cette commande permet la cr<63>ation d'un ou plusieurs nouveaux interpr<70>teurs Tcl qui coexistent avec l'interpr<70>teur cr<63>ateur dans la m<>me application. L'interpr<70>teur cr<63>ateur est appel<65> le <i>ma<EFBFBD>tre</i> et le nouvel interpr<70>teur est appel<65> l'<i>esclave</i>. Un ma<6D>tre peut cr<63>er n'importe quel nombre d'esclaves, et chaque esclave peut lui-m<>me cr<63>er des esclaves suppl<70>mentaires pour lequel il est ma<6D>tre, cr<63>ant ainsi une hi<68>rarchie d'interpr<70>teurs. </div>
<div ALIGN="LEFT" style="margin-left: 51px;">Chaque interpr<70>teur est ind<6E>pendant des autres: il a son propre namespace pour les commandes, fonctions, et variables globales. Un ma<6D>tre interpr<70>teur peut cr<63>er des connections entre ses esclaves et lui-m<>me en utilisant un m<>canisme appel<65> un <i>alias</i> Un <i>alias</i> est une commande dans un interpr<70>teur esclave qui, quand elle est appel<65>e, provoque l'appel d'une commande dans son interpr<70>teur ma<6D>tre ou dans un autre interpr<70>teur esclave Les seules autres connections entre interpr<70>teurs sont au travers de variable d'environnements (la variable<b> env</b>), qui sont normalement partag<61>es entre tous les interpr<70>teurs dans l'application. Notez que le namespace pour les fichiers (tel que les noms renvoy<6F> par la commande<A HREF="142.htm"><b> open</b></A>) n'est pas partag<61> entre interpr<70>teurs. Des commandes explicites sont fournies pour partager les fichiers et transf<73>rer les r<>f<EFBFBD>rences <20> un fichier ouvert d'un interpr<70>teur <20> un autre. </div>
<div ALIGN="LEFT" style="margin-left: 51px;">La commande <b>interp</b> fournit aussi le support des interpr<70>teurs<i> safe</i> Un interpr<70>teur s<>r est un esclave dont les fonctions ont <20>t<EFBFBD> grandement restreintes, ainsi il est plus s<>r d'ex<65>cuter un script <20>tranger sans risque pour les autres interpr<70>teurs ou l'environnement d'application. Par exemple, toutes commandes de cr<63>ation de canal IO et les commandes de cr<63>ation de sous-process sont rendues inaccessible aux interpr<70>teurs s<>rs. Voir INTERPRETEURS SURS ci-dessous pour plus d'information sur les fonctionnalit<69>s pr<70>sentes dans un interpr<70>teur s<>r. Les fonctionalit<69>s dangereuses ne sont pas enlev<65>es de l'interpr<70>teur s<>r; par contre, elle sont <i>cach<EFBFBD>es</i>, ainsi seul les interpr<70>teurs de confiance peuvent y acceder. Pour une explication d<>taill<6C>e des commandes cach<63>es, voir COMMANDES CACHEES, ci-dessous. Le m<>canisme d'alias peut <20>tre utilis<69> pour une communication prot<6F>g<EFBFBD>e (analogue <20> un appel kernel) entre un interpr<70>teur esclave et son ma<6D>tre. Voir INVOCATION D'ALIAS, ci-dessous, pour plus de d<>tails sur comment le m<>canisme d'alias fonctionne. </div>
<div ALIGN="LEFT" style="margin-left: 51px;">Un nom d'interpr<70>teur qualifi<66> est une liste Tcl correcte contenant une sous ensemble de ses anc<6E>tres dans la hi<68>rarchie de l'interpr<70>teur, termin<69>e par les cha<68>ne d<>signant l'interpr<70>teur dans son ma<6D>tre imm<6D>diat. Les noms d'interpr<70>teur sont relatif <20> l'interpr<70>teur dans lequel ils sont utilis<69>s. Par exemple, si <b>a</b> est un esclave de l'interpr<70>teur courant et qu'il a un esclave <b>a1</b>, qui <20> son tour a un esclave <b>a11</b>, le nom qualifi<66> de <b>a11</b> dans <b>a</b> est la liste <b>a1 a11</b>. </div>
<div ALIGN="LEFT" style="margin-left: 51px;">La commande<b> interp</b>, d<>crite ci-dessous, accepte des noms d'interpr<70>teur qualifi<66>s comme arguments; l'interpr<70>teur dans lequel la commande est <20>valu<6C>e peut toujours <20>tre r<>f<EFBFBD>renc<6E> comme <b>&#123;}</b> (la liste ou cha<68>ne vide). Notez qu'il est impossible de se referer&nbsp; <20> un ma<6D>tre (ancestor) interpr<70>teur par son nom dans un interpr<70>teur esclave except<70> au travers d'alias. Egalement, il n'y a pas de nom global par lequel se referer&nbsp; au premier interpr<70>teur cr<63><72> dans une application. L'ensemble de ces restrictions sont motiv<69>es par des raisons de s<>curit<69> <br>
</div> <br>
<div><b>LA COMMANDE INTERP </b></div> <br>
<div ALIGN="LEFT" style="margin-left: 51px;">La commande <b>interp</b> est utilis<69>e pour cr<63>er, effacer, et manipuler des interpr<70>teurs esclaves, et pour partager ou transferer des canaux entre interpr<70>teurs Elle peut avoir une parmi plusieurs formes, d<>pendantes de l'argument<i> option</i>:
<DL>
<DT><br><b>interp</b> <b>alias</b> <i>srcPath</i> <i>srcCmd</i>
</DT><DD>Renvoie une liste Tcl dont les <20>l<EFBFBD>ments sont les <i>targetCmd</i> et <i>arg</i>s associ<63>s <20> l'alias nomm<6D> <i>srcCmd</i> (ce sont toutes les valeurs sp<73>cifi<66>es quand l'alias a <20>t<EFBFBD> cr<63><72>; il est possible que la commande source actuelle dans l'esclave soit diff<66>rente de <i>srcCmd</i> si elle a <20>t<EFBFBD> renomm<6D>e).
</DD>
<DT><br><b>interp</b> <b>alias</b> <i>srcPath</i> <i>srcCmd</i> <b>&#123;}</b>
</DT><DD>Efface l'alias de <i>srcCmd</i> dans l'interpr<70>teur esclave identifi<66> par <i>srcPath</i>. <i>srcCmd</i> se r<>f<EFBFBD>re au nom sous lequel l'alias a <20>t<EFBFBD> cr<63><72> si la commande source a <20>t<EFBFBD> renomm<6D>e, la commande renomm<6D>e sera effac<61>e.
</DD>
<DT><br><b>interp</b> <b>alias</b> <i>srcPath</i> <i>srcCmd</i> <i>targetPath</i> <i>targetCmd </i>?<i>arg arg ...</i>?
</DT><DD>Cette commande cr<63>e un alias entre un esclave et un autre (voyez la commande <b>alias</b> esclave ci-dessous pour la cr<63>ation d'alias entre un esclave et son ma<6D>tre) Dans cette commande, chacun des interpr<70>teurs esclave peut <20>tre n'importe o<> dans la hi<68>rarchie des interpr<70>teurs sous l'interpr<70>teur qui appelle la commande. <i>SrcPath</i> et <i>srcCmd</i> identifient le source de l'alias. <i>SrcPath</i> est une liste Tcl dont les <20>l<EFBFBD>ments d<>signent un interpr<70>teur particulier Par exemple, &quot;<b>a b</b>&quot; identifie un interpr<70>teur <b>b</b>, qui est une esclave de l'interpr<70>teur <b>a</b>, qui est un esclave de l'interpr<70>teur appelant Une liste vide sp<73>cifie l'interpr<70>teur appelant la commande <i>srcCmd</i> donne le nom d'une nouvelle commande, qui sera cr<63><72>e dans l'interpr<70>teur source. <i>TargetPath</i> et <i>targetCmd</i> sp<73>cifient une cible interpr<70>teur et commande, et l'arguments<i> arg</i>, s'il existe, Sp<53>cifie les arguments suppl<70>mentaires <20> <i>targetCmd</i> qui sont ajout<75>s <20> tout argument sp<73>cifi<66> dans l'appel de <i>srcCmd</i>. <i>TargetCmd</i> peut <20>tre ind<6E>fini <20> l'instant de cet appel, ou il peut existe d<>j<EFBFBD>r; il n'est pas cr<63><72> par cette commande. L'alias pr<70>pare la commande cible <20> <20>tre appel<65>e&nbsp; dans l'interpr<70>teur cible chaque fois que la commande source est appel<65>e dans l'interpr<70>teur source Voir APPEL D'ALIAS ci-dessous pour plus de d<>tails.
</DD>
<DT><br><b>interp</b> <b>aliases </b>?<i>path</i>?
</DT><DD>Cette commande retourne une liste Tcl de noms de toutes les commandes source des alias d<>finis dans l'interpr<70>teur identifi<66> par <i>path</i>.
<b>interp</b> <b>create </b>?<b>-safe</b>? ?<b>--</b>? ?<i>path</i>?<br>
Cr<EFBFBD>e un interpr<70>teur esclave identifi<66> par <i>path</i> et une nouvelle commande, appel<65> une <i>slave command</i>. Le nom de la commande esclave est le dernier composant de <i>path</i>. Le nouvel interpr<70>teur esclave et la commande esclave sont cr<63><72>e dans l'interpr<70>teur identifi<66> par le chemin obtenu en enlevant le dernier composant de <i>path</i>. Par exemple, si <i>path </i>est<i> </i><b>a bc</b> alors un nouvel interpr<70>teur et commande esclave nomm<6D>s <b>c</b> sont cr<63><72>s dans l'interpr<70>teur identifi<66> par les chemin <b>a b</b>. La commande esclave peut <20>tre employ<6F>e pour manipuler le nouvel interpr<70>teur comme d<>crit ci-dessous. Si <i>path</i> est omis, Tcl cr<63>e un nom unique de la forme <b>interp</b><i>x</i>, o<> <i>x</i> est un entier, et l'utilise pour l'interpr<70>teur et la commande esclave. Si le switch <b>-safe</b> est sp<73>cifi<66> (ou si le ma<6D>tre interpr<70>teur est un interpr<70>teur s<>r), le nouvel interpr<70>teur esclave sera cr<63><72> comme un interpr<70>teur s<>r avec des fonctionalit<69> limit<69>es; autrement l'esclave inclutra le jeu complet des commandes et variables Tcl internes. Le <b>--</b> switch peut <20>tre utilis<69> pour marquer la fin des commutateurs;&nbsp; il peut <20>tre n<>cessaires si <i>path</i> est une valeur inhabituelle telle que <b>-safe</b>. Le r<>sultat de la commande est le nom du nouvel interpr<70>teur. Le nom d'un interpr<70>teur esclave doit <20>tre unique parmi tout les esclaves; une erreur se produit si le nom d'un interpr<70>teur esclave existe d<>j<EFBFBD> pour ce ma<6D>tre.
</DD>
<DT><br><b>interp</b> <b>delete </b>?<i>path ...?</i>
</DT><DD>Efface z<>ro ou plus interpr<70>teurs donn<6E>s par les arguments optionnels <i>path</i>, et pour chaque interpr<70>teur, efface aussi ses esclaves. La commande efface aussi la commande esclave de chaque interpr<70>teur effac<61>. Pour chaque argument<i> path</i>, si aucun interpr<70>teur de ce nom existe, la commande l<>ve une erreur.
</DD>
<DT><br><b>interp</b> <b>eval</b> <i>path arg </i>?<i>arg ...</i>?
</DT><DD>Cette commande concat<61>ne tous les arguments <i>arg</i> de la m<>me fa<66>on que la commande<A HREF="98.htm"><b> concat</b></A>, et <20>value alors la cha<68>ne r<>sultante comme script Tcl dans l'interpr<70>teur esclave identifi<66> par <i>path</i>. Le r<>sultat de cette evaluation (incluant l'information d'erreur telle que les variables<b> errorInfo</b> et <b>errorCode</b>, si une erreur se produit) est renvoy<6F> <20> l'interpr<70>teur appelant .
</DD>
<DT><br><b>interp exists </b><i>path</i></DT><DD>Renvoie <b>1</b> si un interpr<70>teur esclave du <i>path</i> sp<73>cifi<66> existe dans ce ma<6D>tre, <b>0</b> autrement. Si <i>path</i> est omis, l'interpr<70>teur appelant est utilis<69>.
</DD>
<DT><br><b>interp expose </b><i>path</i> <i>hiddenName</i> ?<i>exposedCmdName</i>?
</DT><DD>Rend la commande cach<63>e <i>hiddenName</i> visible, en lui donnant <20>ventuellement un nouveau nom <i>exposedCmdName</i> (ce nom est couramment accept<70> seulement si c'est un nom global valide sans quelconque ::), dans l'interpr<70>teur d<>sign<67> par <i>path</i>. Si une commande visible avec le nom cible existe d<>j<EFBFBD>, cette commande <20>choue. Les commandes cach<63>es sont expliqu<71>es plus en d<>tail dans COMMANDES CACHEES , ci-dessous.
</DD>
<DT><br><b>interp</b> <b>hide</b> <i>path</i> <i>exposedCmdName</i> ?<i>hiddenCmdName</i>?
</DT><DD>Cache la commande visible <i>exposedCmdName</i>, en la renommant en commande cach<63>e <i>hiddenCmdName</i>, ou conservant le m<>me nom si <i>hiddenCmdName</i> n'est pas donn<6E>, dans l'interpr<70>teur d<>sign<67>&nbsp; par <i>path</i>. Si une commande cach<63>e avec le nom cibl<62> existe d<>j<EFBFBD>, cette commande <20>choue. <i>exposedCmdName</i> et <i>hiddenCmdNamene&nbsp; </i> peuvent&nbsp; pas contenir en m<>me temps de qualificateurs namespace, ou une erreur est lev<65>e. Les commandes <20> cacher par <b>interp hide</b> sont recherch<63>es dans le namespace global&nbsp; m<>me si le namespace&nbsp; courant n'est pas le global. Ceci emp<6D>che les esclaves d'abuser un ma<6D>tre interpr<70>teur en cachant les mauvaises commandes, en rendant le namespace courant diff<66>rent du global. Les commandes cach<63>es sont expliqu<71>es plus en d<>tail dans COMMANDES CACHEES , ci-dessous.
</DD>
<DT><br><b>interp</b> <b>hidden</b> <i>path</i>
</DT><DD>Renvoie une liste des noms de toutes les commandes cach<63>es dans l'interpr<70>teur identifi<66> par <i>path</i>.
</DD>
<DT><br><b>interp</b> <b>invokehidden</b> <i>path</i> ?<b>-global</b>? <i>hiddenCmdName</i> ?<i>arg ...</i>?
</DT><DD>Appelle la commande cach<63>e <i>hiddenCmdName</i> avec les arguments fournis dans l'interpr<70>teur d<>sign<67> par <i>path</i>. Aucune substitution ou <20>valuation ne sont appliqu<71>es aux arguments. Si le flag <b>-global</b> est pr<70>sent, la commande cach<63>e est appel<65>e au niveau global dans l'interpr<70>teur cible; autrement elle est appel<65>e dans le cadre d'appel courant et peut acceder aux variables locales dans ce cadre et appeler des cadres externes. Les commandes cach<63>es sont expliqu<71>es plus en d<>tail dans COMMANDES CACHEES , ci-dessous.
</DD>
<DT><br><b>interp issafe</b> ?<i>path</i>?
</DT><DD>Renvoie <b>1</b> si l'interpr<70>teur identifi<66> par le <i>path</i> sp<73>cifi<66> est s<>r, <b>0</b> autrement.
</DD>
<DT><br><b>interp marktrusted</b> <i>path</i>
</DT><DD>Marque l'interpr<70>teur identifi<66> par <i>path</i> comme fiable. Ne montre pas les commande cach<63>es. Cette commande peut seulement <20>tre appel<65>e <20> partir d'un interpr<70>teur de confiance. La commande n'a pas d'effet si l'interpr<70>teur identifi<66> par <i>path</i> est d<>j<EFBFBD> fiable.
</DD>
<DT><br><b>interp</b> <b>share</b> <i>srcPath channelId destPath</i>
</DT><DD>Met en place le partage du canal IO identifi<66> par <i>channelId</i> entre l'interpr<70>teur identifi<66> par <i>srcPath</i> et l'interpr<70>teur identifi<66> par <i>destPath</i>. Les deux interpr<70>teurs ont les m<>me permissions sur le canal IO. Les deux interpr<70>teurs doivent le fermer pour fermer le IO canal sous-jacent; les canaux IO accessibles dans un interpr<70>teur sont automatiquement ferm<72>s quand un interpr<70>teur est d<>truit.
</DD>
<DT><br><b>interp</b> <b>slaves</b> ?<i>path</i>?
</DT><DD>Renvoie une liste Tcl des noms de tous les interpr<70>teurs esclaves associ<63>s <20> l'interpr<70>teur identifi<66> par <i>path</i>. Si <i>path</i> est omis, l'interpr<70>teur appelant est utilis<69>.
</DD>
<DT><br><b>interp</b> <b>target</b> <i>path alias</i>
</DT><DD>Renvoie une liste Tcl d<>crivant l'interpr<70>teur cible d'un alias. L'alias est sp<73>cifi<66> avec un chemin d'interpr<70>teur et le nom de la commande source, juste comme dans <b>interp </b><b>alias</b> plus haut. Le nom de&nbsp; l'interpr<70>teur cible est renvoy<6F> comme un chemin d'interpr<70>teur, relatif <20> l'interpr<70>teur appelant . Si l'interpr<70>teur cible de l'alias est l'interpr<70>teur appelant alors une liste vide est renvoy<6F>e. Si l'interpr<70>teur cible de l'alias n'est pas l'interpr<70>teur appelant ou un de ses descendants alors une erreur est g<>n<EFBFBD>r<EFBFBD>e. La commande cible n'a pas a <20>tre d<>finie <20> l'instant de cet appel.
</DD>
<DT><br><b>interp</b> <b>transfer</b> <i>srcPath channelId destPath</i>
</DT><DD>Rends le canal IO identifi<66> par <i>channelId</i> disponible dans l'interpr<70>teur identifi<66> par <i>destPath</i> et indisponible dans l'interpr<70>teur identifi<66> par <i>srcPath</i>
</DD>
</DL>
</div><br>
<div><b>LA COMMANDE SLAVE </b></div><br>
<div ALIGN="LEFT" style="margin-left: 51px;">Pour chaque interpr<70>teur esclave cr<63><72> avec lA commande<b> interp</b>, une nouvelle commande Tcl est cr<63><72>e dans le ma<6D>tre interpr<70>teur avec le m<>me nom que le nouvel interpr<70>teur. Cette commande peut <20>tre employ<6F>e pour faire des op<6F>rations vari<72>es sur l'interpr<70>teur Elle a la forme g<>n<EFBFBD>rale suivante:
<i>slave command </i>?<i>arg arg ...</i>?</div>
<div ALIGN="LEFT" style="margin-left: 51px;"><i>Slave</i> est le nom de l'interpr<70>teur, et <i>command</i> et <i>arg</i>s determinent le comportement exact de la commande. Les formes valides de cette commande sont:
<DL>
<DT><br><i>slave </i><b>aliases</b>
</DT><DD>Renvoie une liste Tcl dont les <20>l<EFBFBD>ments sont les noms de tous les alias dans <i>slave</i> Les noms renvoy<6F>s sont les valeurs <i>srcCmd</i> utilis<69>es quand les alias ont <20>t<EFBFBD> cr<63><72>s (qui ne peuvent pas <20>tre les m<>me que les noms des commandes courantes, si elles ont <20>t<EFBFBD> renomm<6D>es).
</DD>
<DT><br><i>slave </i><b>alias </b><i>srcCmd</i>
</DT><DD>Renvoie une liste Tcl dont les <20>l<EFBFBD>ments sont les <i>targetCmd</i> et <i>arg</i>s associ<63>s <20> l'alias nomm<6D> <i>srcCmd</i> (toutes sont les valeurs sp<73>cifi<66>es quand l'alias a <20>t<EFBFBD> cr<63><72>e; il est possible que la commande source actuelle dans l'esclave soit diff<66>rente de <i>srcCmd</i> si elle a <20>t<EFBFBD> renomm<6D>e).
</DD>
<DT><br><i>slave </i><b>alias </b><i>srcCmd </i><b>&#123;}</b>
</DT><DD>Efface l'alias de <i>srcCmd</i> dans l'interpr<70>teur esclave. <i>srcCmd</i> se r<>f<EFBFBD>re au nom sous lequel l'alias a <20>t<EFBFBD> cr<63><72> si la commande source a <20>t<EFBFBD> renomm<6D>e, la commande renomm<6D>e sera effac<61>.
</DD>
<DT><br><i>slave </i><b>alias </b><i>srcCmd targetCmd </i>?<i>arg ..</i>?
</DT><DD>Cr<EFBFBD>e un alias tel que chaque fois que <i>srcCmd</i> est appel<65>e dans <i>slave</i>, <i>targetCmd</i> est appel<65>e dans le ma<6D>tre. Les arguments <i>arg</i> seront transmis <20> <i>targetCmd</i> comme arguments suppl<70>mentaires, ajout<75>s avant tout argument transmis dans l'appel de <i>srcCmd</i>. Voir&nbsp; APPEL D'ALIAS ci-dessous pour les d<>tails.
</DD>
<DT><br><i>slave </i><b>eval </b><i>arg </i>?<i>arg ..</i>?</DT><DD>Cette commande concat<61>ne tous les arguments <i>arg</i> de la m<>me fa<66>on que&nbsp; la commande<A HREF="98.htm"><b> concat</b></A>, et <20>value la cha<68>ne r<>sultante comme un script Tcl dans <i>slave</i>. Le r<>sultat de cette <20>valuation (incluant information erreur telle que les variables<b> </b><b>errorInfo</b> et <b>errorCode</b>, si une erreur se produit) est renvoy<6F> <20> l'interpr<70>teur appelant .
</DD>
<DT><br><i>slave </i><b>expose </b><i>hiddenName </i>?<i>exposedCmdName</i>?
</DT><DD>Cette commande expose la commande cach<63>e<i>hiddenName</i>, lui donnant <20>ventuellement un nouveau nom <i>exposedCmdName</i> (ce nom est couramment accept<70> seulement si c'est une nom global valide sans quelconque ::), dans <i>slave</i>. Si une commande visible avec le nom cibl<62> existe d<>j<EFBFBD>, cette commande <20>choue. Pour plus details sur les commande cach<63>es, voir COMMANDES CACHEES , ci-dessous.
</DD>
<DT><br><i>slave </i><b>hide </b><i>exposedCmdName</i> ?<i>hiddenCmdName</i>?
</DT><DD>Cette commande cache la commande visible <i>exposedCmdName</i>, en la renommant en la commande cach<63>e <i>hiddenCmdName</i>, ou gardant le m<>me nom si l'argument n'est pas donn<6E>, dans l'interpr<70>teur<i> slave</i>. Si une commande cach<63>e avec le nom cibl<62> existe d<>j<EFBFBD>, cette commande <20>choue. Autant <i>exposedCmdName</i> que <i>hiddenCmdName</i> ne peuvent contenir de qualificateurs namespace, ou une erreur est lev<65>e. Les commandes a cacher sont recherch<63>e dans le namespace global&nbsp; m<>me si le namespace&nbsp; courant n'est pas le global un . Ceci emp<6D>che les esclaves d'abuser un ma<6D>tre interpr<70>teur en cachant les mauvaises commandes, en rendant le namespace courant diff<66>rent du global. Pour plus details sur les commande cach<63>es, voir COMMANDES CACHEES , ci-dessous.
</DD>
<DT><br><i>slave </i><b>hidden</b></DT><DD>Renvoie une liste des noms de toutes les commande cach<63>es dans <i>slave</i>.
<i>slave </i><b>invokehidden</b> ?<b>-global</b> <i>hiddenName </i>?<i>arg ..</i>?<br>
Cette commande appelle la commande cach<63>e <i>hiddenName</i> avec les arguments fournis, dans <i>slave</i>. Aucune substitutions ou <20>valuations ne sont appliqu<71>es aux arguments. Si le flag <b>-global</b> est donn<6E>, la commande est appel<65>e au niveau global dans l'esclave; autrement elle est appel<65>e dans le cadre d'appel courant et peut acceder <20> ses variables locales ou appeler des cadres externes. Pour plus details sur les commande cach<63>es, voir COMMANDES CACHEES , ci-dessous.
</DD>
<DT><br><i>slave </i><b>issafe</b>
</DT><DD>Renvoie <b>1</b> si l'interpr<70>teur esclave est s<>r, <b>0</b> autrement.
<DT><br><i>slave </i><b>marktrusted</b>
</DT><DD>Marque l'interpr<70>teur esclave comme fiable. Peut seulement <20>tre appel<65>e par un interpr<70>teur de confiance. Cette commande ne rend visible aucune commande cach<63>e dans l'interpr<70>teur esclave. La commande n'a pas d'effet si l'esclave est d<>j<EFBFBD> fiable <br>
</DD>
</DL>
</div><br>
<div><b>SAFE INTERPRETERS</b></div><br>
<div ALIGN="LEFT" style="margin-left: 51px;">Un interpr<70>teur s<>r a des fonctionalit<69> restreintes, ainsi il est s<>r d'ex<65>cuter un script arbitraire donn<6E> par votre pire ennemi sans s'inqui<75>ter pour l'application h<>te ou le reste de votre environnement de travail De mani<6E>re <20> rendre un interpr<70>teur s<>r, certaines commandes et variables sont enlev<65>se de l'interpr<70>teur. Par exemple, les commandes pour cr<63>er fichiers sur disque sont enlev<65>es, et la commande <A HREF="105.htm"><b>exec</b></A> est enlev<65>e, car elle pourrait <20>tre utilis<69>e pour faire des d<>gats <20> l'aide de sous-processus. Un acc<63>s limit<69> <20> ces facilit<69>s peut <20>tre fourni, par cr<63>ation d'alias du ma<6D>tre interpr<70>teur pour v<>rifier leurs arguments soigneusement et fournir un acc<63>s restreint <20> une sous ensemble s<>r de facilit<69>s. Par exemple, la cr<63>ation de fichier pourra <20>tre autoris<69> dans un sous r<>pertoire particulier et l'appel de sous-processus pourra <20>tre autoris<69> pour un ensemble soigneusement choisi de programmes. </div>
<div ALIGN="LEFT" style="margin-left: 51px;">Un interpr<70>teur s<>r est cr<63><72>e en specifiant le switch <b>-safe</b> <20> la commande<b> interp create</b> N<>anmoins, tout esclave cr<63><72> par un interpr<70>teur s<>r sera aussi s<>r. </div>
<div ALIGN="LEFT" style="margin-left: 51px;">Un interpr<70>teur s<>r est cr<63><72>e avec exactement ce jeu de commandes internes: </div><br>
<b><TABLE ALIGN="center" BORDER="0" CELLSPACING="0" CELLPADDING="0" WIDTH="60%">
<TR>
<TD>
after
</TD>
<TD>
append
</TD>
<TD>
array
</TD>
<TD>
binary
</TD>
</TR>
<TR>
<TD>
break
</TD>
<TD>
case
</TD>
<TD>
catch
</TD>
<TD>
clock
</TD>
</TR>
<TR>
<TD>
close
</TD>
<TD>
concat
</TD>
<TD>
continue
</TD>
<TD>
eof
</TD>
</TR>
<TR>
<TD>
error
</TD>
<TD>
eval
</TD>
<TD>
expr
</TD>
<TD>
fblocked
</TD>
</TR>
<TR>
<TD>
fcopy
</TD>
<TD>
fileevent
</TD>
<TD>
flush
</TD>
<TD>
for
</TD>
</TR>
<TR>
<TD>
foreach
</TD>
<TD>
format
</TD>
<TD>
gets
</TD>
<TD>
global
</TD>
</TR>
<TR>
<TD>
history
</TD>
<TD>
if
</TD>
<TD>
incr
</TD>
<TD>
info
</TD>
</TR>
<TR>
<TD>
interp
</TD>
<TD>
join
</TD>
<TD>
lappend
</TD>
<TD>
lindex
</TD>
</TR>
<TR>
<TD>
linsert
</TD>
<TD>
list
</TD>
<TD>
llength
</TD>
<TD>
lrange
</TD>
</TR>
<TR>
<TD>
lreplace
</TD>
<TD>
lsearch
</TD>
<TD>
lsort
</TD>
<TD>
namespace
</TD>
</TR>
<TR>
<TD>
package
</TD>
<TD>
pid
</TD>
<TD>
proc
</TD>
<TD>
puts
</TD>
</TR>
<TR>
<TD>
read
</TD>
<TD>
regexp
</TD>
<TD>
regsub
</TD>
<TD>
rename
</TD>
</TR>
<TR>
<TD>
return
</TD>
<TD>
scan
</TD>
<TD>
seek
</TD>
<TD>
set
</TD>
</TR>
<TR>
<TD>
split
</TD>
<TD>
string
</TD>
<TD>
subst
</TD>
<TD>
switch
</TD>
</TR>
<TR>
<TD>
tell
</TD>
<TD>
trace
</TD>
<TD>
unset
</TD>
<TD>
update
</TD>
</TR>
<TR>
<TD>
uplevel
</TD>
<TD>
upvar
</TD>
<TD>
variable
</TD>
<TD>
vwait
</TD>
</TR>
<TR>
<TD>
while
</TD>
<TD>
<!--R17C2-->
</TD>
<TD>
<!--R17C3-->
</TD>
<TD>
<!--R17C4-->
</TD>
</TR>
</TABLE></b>
<br>
</div>
<div ALIGN="LEFT" style="margin-left: 51px;">Les commandes suivantes sont cach<63>es par <b>interp create</b> quand il cr<63>e un interpr<70>teur s<>r: </div><br>
<TABLE ALIGN="center" BORDER="0" CELLSPACING="0" CELLPADDING="0" WIDTH="60%">
<TR>
<TD>
cd
</TD>
<TD>
exec
</TD>
<TD>
exit
</TD>
<TD>
fconfigure
</TD>
</TR>
<TR>
<TD>
file
</TD>
<TD>
glob
</TD>
<TD>
load
</TD>
<TD>
open
</TD>
</TR>
<TR>
<TD>
pwd
</TD>
<TD>
socket
</TD>
<TD>
source
</TD>
<TD>
vwait
</TD>
</TR>
</TABLE><br>
<div ALIGN="LEFT" style="margin-left: 51px;">Ces commandes peuvent <20>tre recr<63><72>es plus tard comme fonctions ou alias Tcl, ou r<>expos<6F>es avec <b>interp expose</b>. </div>
<div ALIGN="LEFT" style="margin-left: 51px;">De plus, la variable <b>env</b> n'est pas pr<70>sente dans un interpr<70>teur s<>r, donc il ne peut partager des variables d'environnement avec les autres interpr<70>teurs. La variable <b>env</b> pose un probl<62>me de s<>curit<69>, parce que les utilisateurs peuvent stocker de l'information sensible dans une variable d'environnement. Par exemple, le manuel PGP recommende de stocker le mot de passe de protection de la cl<63> PGP priv<69>e dans la variable d'environnement <i>PGPPASS</i>. Rendre cette variable disponible <20> l'ex<65>cution de code <20>tranger dans un interpr<70>teur s<>r induirait une faille de s<>curit<69>. </div>
<div ALIGN="LEFT" style="margin-left: 51px;">Si les extensions sont charg<72>es dans un interpr<70>teur s<>r, elles peuvent aussi restraindre leur propre fonctionalit<69> pour <20>liminer les commandes sensibles. Pour une discussion sur la getion des extensions pour la s<>curit<69> voyez l 'entr<74>e de manuel des commandes Tcl<A HREF="158.htm"><b> Safe</b></A><b>-</b><A HREF="78.htm"><b>Tcl</b></A> et <A HREF="134.htm"><b>load</b></A>
</div><br>
<div><b>APPEL D'ALIAS</b></div><br>
<div ALIGN="LEFT" style="margin-left: 51px;">Le m<>canisme alias a <20>t<EFBFBD> soigneusement con<6F>u ainsi il peut <20>tre utilis<69> s<>rement quand un script non fiable est ex<65>cut<75> dans un esclave s<>r et que le cible de l'alias est une ma<6D>tres<65>r Lachose la plus importante pour garantir la s<>curit<69> est de s'assurer qui l'information transmise de l'esclave au ma<6D>tre n'est jamais <20>valu<6C>e ou substitu<74>e dans le ma<6D>tre; si ceci se produisait, cela pourrait activer un script de la mort dans l'esclave qui appelerait des fonctions arbitraires dans le ma<6D>tre, pour compromettre la s<>curit<69>. </div>
<div ALIGN="LEFT" style="margin-left: 51px;">Quand la source d'un alias est appel<65>e dans l'interpr<70>teur esclave, les substitutions Tcl usuelles sont effectu<74>es <20> l'analyse de la commande. Ces substitutions sont effectu<74>es dans l'interpr<70>teur source juste comme elles seraient faites pour tout autre commande appel<65>e dans cet interpr<70>teur. La fonction de commande de la commande source prend ses arguments et les m<>lange avec les <i>targetCmd</i> et <i>arg</i>s de l'alias pour cr<63>er un nouveau tableau d'arguments Si les mots de <i>srcCmd</i> etaient &quot;<i>srcCmd arg1 arg2 ... argN</i>&quot;, le nouvel ensemble de mots sera &quot;<i>targetCmd arg arg ... arg arg1 arg2 ... argN</i>&quot;, o<> <i>targetCmd</i> et <i>arg</i>s sont les valeurs fournies quand l'alias a <20>t<EFBFBD> cr<63><72>. <i>TargetCmd</i> est alors utilis<69>e pour localiser une fonction de commande dans l'interpr<70>teur cible, et cette fonction de commande est appel<65>e avec le nouveau jeu d'aguments Un erreur se produit s'il n'y a pas commande nomm<6D>e <i>targetCmd</i> dans l'interpr<70>teur cible. Aucunes substitutions suppl<70>mentaires ne sont effectu<74>es sur les mots, la fonction de commande cible est appel<65>e directement, sans passer au travers du m<>canisme evaluation Tcl normal. Les substitutions sont ainsi effectu<74>es sur chaque mot exactement une seule fois: <i>targetCmd</i> et <i>args</i> ont <20>t<EFBFBD> substitu<74>es pendant l'analyse de la commande qui cr<63><72>e l'alias, et <i>arg1 - argN</i> sont substitu<74>es quand la commande source de l'alias est analys<79>e dans l'interpr<70>teur source. </div>
<div ALIGN="LEFT" style="margin-left: 51px;">A l'<27>criture de <i>targetCmd</i>s pour des alias dans des interpr<70>teurs s<>rs, il est tr<74>s important que les arguments de cette commande ne soient jamais <20>valu<6C>s ou substitu<74>s, car ceci fournirait un m<>canisme d'<27>chappement par lequel les interpr<70>teurs esclaves pourraient ex<65>cuter du code arbitraire dans le ma<6D>tre Par cons<6E>quent, ceci pourrait compromettre la s<>curit<69> du syst<73>me
</div><br>
<div><b>COMMANDES CACHEES</b></div><br>
<div ALIGN="LEFT" style="margin-left: 51px;">Les interpr<70>teurs s<>rs restreignent grandement les fonctionalit<69>s disponibles pour les programmes Tcl qui seraient <20>xecut<75>s. Permettre <20> du code Tcl non fiable un acc<63>s direct <20> ces fonctionalit<69>s est dangeureux, parce que il peut <20>tre utilis<69> pour un grand nombre d'attaques sur l'environnement. N<>anmoins, il y a parfois un besoin legitime d'utiliser les fonctionalit<69>s dangereuses dans le contexte de l'interpr<70>teur s<>r. Par exemple, parfois un programme doit <20>tre <A HREF="163.htm"><b>source</b></A>d dans l'interpr<70>teur. Un autre exemple est Tk, ou des fen<65>tres sont attach<63>es <20> une hi<68>rarchie de fen<65>tres pour un interpr<70>teur sp<73>cifique; quelque potentiellement dangereuse fonctions, ex. gestion de fen<65>tres, doit <20>tre effectu<74>e sur ces fen<65>tres dans le contexte de l'interpr<70>teur. </div>
<div ALIGN="LEFT" style="margin-left: 51px;">La commande <b>interp</b> fournit une solution <20> ce probl<62>me sous la forme des <i>hidden commands</i>. Au lieu d'enlever enti<74>rement les commandes dangereuses d'un interpr<70>teur s<>r, ces commandes sont cach<63>es donc elles deviennent indisponibles pour les l'ex<65>cution de scripts Tcl dans l'interpr<70>teur. N<>anmoins, ces commande cach<63>es peuvent <20>tre appel<65>e par anc<6E>tre fiable de l'interpr<70>teur s<>r, dans le contexte de l'interpr<70>teur s<>r, en utilisant <b>interpinvoke</b>. Les commandes cach<63>es et commandes visibles r<>sident dans des namespaces s<>par<61>s. Il est possible de definir une commande cach<63>e et un commande visible portant les m<>me nom dans un interpr<70>teur. </div>
<div ALIGN="LEFT" style="margin-left: 51px;">Les commandes cach<63>es dans un interpr<70>teur esclave peuvent <20>tre appel<65>es dans le corps des fonctions appel<65>es dans le ma<6D>tre pendant l'appel d'alias. Par exemple, un alias de <A HREF="163.htm"><b>source</b></A> pourrait <20>tre cr<63><72> dans un interpr<70>teur esclave. Quand elle est appel<65>e dans l'interpr<70>teur esclave, une fonction est appel<65>e dans le ma<6D>tre interpr<70>teur pour v<>rifier si l'op<6F>ration est autoris<69>e (ex. il demande de <i>sourcer</i> un fichier que l'interpr<70>teur esclave est autoris<69> <20> acc<63>der). La fonction alors appelle la commande <A HREF="163.htm"><b>source</b></A> cach<63>e dans l'interpr<70>teur esclave pour <i>sourcer</i> le contenu du fichier. Notez que deux commandes nomm<6D>es <A HREF="163.htm"><b>source</b></A> existent dans l'interpr<70>teur esclave: l'alias, et la commande cach<63>e. </div>
<div ALIGN="LEFT" style="margin-left: 51px;">Parcequ'un interpr<70>teur ma<6D>tre peut appeller une commande cach<63>e comme partie de la gestion d'un appel d'alias, grans soin doit <20>tre pris d'<27>viter l'<27>valualuation de tout arguments transmis au travers de l'appel de l'alias. Autrement, un interpr<70>teur esclave malin pourrait faire ex<65>cuter <20> l'interpr<70>teur ma<6D>tre de confiance des commandes dangereuses. Voir la section sur l' APPEL D'ALIAS pour une discussion plus compl<70>te de ce topic. Pour aider <20> <20>viter ce probl<62>me, aucune substitutions ou <20>valuations ne sont appliqu<71>es aux arguments de <b>interp </b><b>invokehidden</b>. </div>
<div ALIGN="LEFT" style="margin-left: 51px;">Les interpr<70>teurs s<>rs ne sont pas autoris<69>s <20> appeler des commande cach<63>es dans eux-m<>mes ou dans leurs descendants. Ceci emp<6D>che les esclaves s<>r d'acceder aux fonctionalit<69> cach<63>es dans eux-m<>mes ou leurs descendants. </div>
<div ALIGN="LEFT" style="margin-left: 51px;">L'ensemble des commandes cach<63>es dans un interpr<70>teur peut <20>tre manipul<75> par un interpr<70>teur de confiance en utilisant <b>interp expose</b> et <b>interp hide</b>. La commande <b>interp expose</b> d<>place une commande cach<63>e dans le jeu de commande visibles dans l'interpr<70>teur identifi<66> par <i>path</i>, potentiellement renommant la commande dans le processus. Si une commande visible du nom cibl<62> existe d<>j<EFBFBD>, l'op<6F>ration <20>choue. Pareillement, <b>interp hide</b> d<>place une commande visible dans le jeu de commande cach<63>es dans cet interpr<70>teur. Les interpr<70>teurs s<>rs ne sont pas autoris<69>s <20> d<>placer les commandes entre l'ensemble des commandes cach<63>es et visibles, dans soit eux-m<>me ou leurs descendants. </div>
<div ALIGN="LEFT" style="margin-left: 51px;">Actuellement, les noms des commande cach<63>es ne peuvent pas contenir de qualificateurs namespace, et vous devez en premier renommer une commande d'un namespace dans le namespace global avant de pouvoir la cacher. Les commandes cach<63>es par <b>interp hide</b> sont recherch<63>e dans le namespace global m<>me si le namespace courant n'est pas le global. Ceci emp<6D>che les esclaves d'abuser un ma<6D>tre interpr<70>teur en cachant les mauvaises commandes, en rendant le namespace courant diff<66>rent du global.
</div><br>
<div><b>CREDITS</b></div><br>
<div ALIGN="LEFT" style="margin-left: 51px;">Ce m<>canisme est bas<61> sur le prototype Safe-Tcl impl<70>ment<6E> par Nathaniel Borenstein et Marshall Rose
</div><br>
<div><b>VOIR EGALEMENT</b></div><br>
<div ALIGN="LEFT" style="margin-left: 51px;"><A HREF="134.htm">load</A>(n), safe(n), Tcl_CreateSlave(3) </div>
<div>Derni<EFBFBD>re r<>vision: 7.6</div>
<br>
<br><div ALIGN="CENTER"><A HREF="index.htm"><b>Index</b></A>&nbsp;&nbsp;<A HREF="125.htm"><b>Pr<EFBFBD>c<EFBFBD>dent</b></A>&nbsp;&nbsp;<A HREF="127.htm"><b>Suivant</b></A></div>
</BODY></HTML>